几乎所有的编程语言都会有一些语法糖。Object-C也不例外,尤其是适用XCode编程时。
@property编译指令,要求编译器自动生成某个属性的getter/setter方法。对于较早Xcode版本(4.4及以前),@property可能还需要和@synthesize指令共同使用来完成相应功能。
@property的基本语法
@property [ ( [attribute] [ , attribute] [ , attribute ...] ) ] typeName valueName
方括号[ ],是可选项。
attribute是限定修饰的valueName,通常有如下几个可选项:
读写
readonly ,只产生简单的getter,没有setter。
readwrite ,产生setter\getter方法,默认类型。
setter语意
assign ,默认类型,setter方法直接赋值,而不进行retain操作。
retain ,setter方法对参数进行release旧值,再retain新值。
copy ,setter方法进行Copy操作,与retain一样。
原子操作
nonatomic,非原子
atomic,原子(默认)
对于ARC工程,attribute还可以是strong,weak。
对于下面的代码
@property(nonatomic,copy) NSString *name;
//在.m文件中。
//对于Xcode4.5及以上,这部分代码可以删除
@synthesize name = _name;
等同于实现了下面的代码
-(NSString*) getName
{
return _name;
}
-(void) setName:(NSString *)name
{
if (_name != name)
{
[_name release];
_name = [name copy];
}
}
在使用@property指令时,需要注意的是:Xcode4.5及以上,会自动生成或者合并形式为_valueName的变量。这不是一个好的便利,可能会造成不必要的麻烦。
例如,@property int number, 如果已经存在 int类型的_number变量,那么getter/setter就直接操作这个变量;如果不存在,那么就自动生成一个int类型的_number变量
@property指令,我个人认为它最大的作用就是使代码看起来简洁而已,可阅读性增强,但是隐藏了包括多线程和内存管理在内细节,这可能会增加程序员出错的几率。
另外,同.net c++ 或C#的property关键字语法比起来,@property指令给我的感觉就显得过于臃肿和不灵活。