objectivec的***@property详解
Objective-c的***@property 详解
之前很多网友对我翻译的教程中的Property的使用感到有些迷惑不解,搞不清楚什么时候要release, = nil;同时对于Objective-c的内存管理以及cocos2d的内存管理规则不够清楚。本文主要讲解objc里面***@property,它是什么,它有什么用,atomic,nonatomic,readonly,readwrite,assign,retain,copy,getter,setter这些关键字有什么用,什么时候使用它们。至于Objc的内存管理和cocos2d的内存管理部分,接下来,我会翻译Ray的3篇教程,那里面再和大家详细讨论。今天我们的主要任务是搞定***@property。
学过c/c++的朋友都知道,我们定义struct/class的时候,如果把访问限定符(public,protected,private)设置为public的话,。比如
//in
class Test
{
public:
int i;
float f;
};
我在main函数里面是可以通过下面的方式来使用这个类的:(注意,如果在main函数里面使用此类,除了要包含头文件以外,,否则会报一些奇怪的错误。所以,任何时候我们使用c++,如果报奇怪的错误,。)
//in
Test test;
=1;
=;
NSLog(@" = %d, = %f",, );
但是,在objc里面,我们能不能这样做呢?请看下面的代码:(新建一个objc类,命名为BaseClass)
//in
***@interface BaseClass : NSObject{
***@public
NSString *_name;
}
接下来,:
BaseClass *base= [[BaseClass alloc] init];
=@"set base name";
NSLog(@"base class's name = %@", );
不用等你编译,xcode4马上提示错误,请看截图:
请大家注意看出错提示“Property 'nam' not found on object of type BaseClass*",意思是,BaseClass这类没有一个名为name的属性。即使我们在头文件中声明了***@public,。而***@public,***@protected和***@private只会影响继承它的类的访问权限,如果你使用***@private声明数据成员,那么在子类中是无法直接使用父类的私有成员的,这和c++,java是一样的。
既然有错误,那么我们就来想法解决啦,编译器说没有***@property,那好,我们就定义property,请看代码:
//in
***@interface BaseClass : NSObject{
***@public
NSString *_name;
}
***@property(nonatomic,copy) NSString *name;
//in
***@synthesize name = _name;
现在,编译并运行,ok,很好。那你可能会问了***@prperty是不是就是让”."号合法了呀?只要定义了***@?先让我们来看下面的例子:
***@interface BaseClass : NSObject{
***@public
NSString *_name;
}
//***@property(nonatomic,copy) NSString *name;-(NSString*) name;
-(void) setName:(NSString*)newName;
我把***@property的定义注释掉了,另外定义了两个函数,name和setNa
objectivec的property详解 来自淘豆网www.taodocs.com转载请标明出处.