===== 最后转载下关于@property(*)括号中的属性内容介绍 =====
atomic: 原子操作(原子性是指事务的一个完整操作,操作成功就提交,反之就回滚. 原子操作就是指具有原子性的操作)在objective-c 属性设置里面默认的就是atomic,意思就是setter/getter函数是一个原子操作,如果多线程同时调用setter时,不会出现某一个线程执行完setter所有语句之前,另一个线程就开始执行setter,相当于函数头尾加了锁. 这样的话并发访问性能会比较低. nonatomic 指出访问器不是原子操作,而默认地,访问器是原子操作。这也就是说,在多线程环境下,解析的访问器提供一个对属性的安全访问,从获取器得到的返回值或者通过设置器设置的值可以一次完成,即便是别的线程也正在对其进行访问。如果你不指定nonatomic,在自己管理内存的环境中,解析的访问器保留并自动释放返回的值,如果指定了nonatomic,那么访问器只是简单地返回这个值。非原子操作 一般不需要多线程支持的时候就用它,这样在并发访问的时候效率会比较高. 在objective-c里面通常对象类型都应该声明为非原子性的. iOS中程序启动的时候系统只会自动生成一个单一的主线程.程序在执行的时候一般情况下是在同一个线程里面对一个属性进行操作. 如果在程序中我们确定某一个属性会在多线程中被使用,并且需要做数据同步,就必须设置成原子性的,但也可以设置成非原子性的,然后自己在程序中用加锁之类的来做数据同步. 在头文件中声明属性的时候使用atomic 和 nonatomic等价于在头文件里面添加2个函数一个是用于设置这个属性的,一个是用于读取这个属性,例如:- (nsstring *)name; - (void)setName:(NSString *)str; atomic / nonatomic 需要和@synthesize/@dynamic配和使用才有意义.
readonly 此标记说明属性是只读的,默认的标记是读写,如果你指定了只读,在@implementation中只需要一个读取器。或者如果你使用@synthesize关键字,也是有读取器方法被解析。而且如果你试图使用点操作符为属性赋值,你将得到一个编译错误。
readwrite 此标记说明属性会被当成读写的,这也是默认属性。设置器和读取器都需要在@implementation中实现。如果使用@synthesize关键字,读取器和设置器都会被解析。
assign 对基础数据类型 (NSInteger,CGFloat)和C数据类型(int, float, double, char, 等等)此标记说明设置器直接进行赋值,这也是默认值。在使用垃圾收集的应用程序中,如果你要一个属性使用assign,且这个类符合NSCopying协议,你就要明确指出这个标记,而不是简单地使用默认值,否则的话,你将得到一个编译警告。这再次向编译器说明你确实需要赋值,即使它是可拷贝的。 retain 对其他NSObject和其子类 对参数进行release旧值,再retain新值 指定retain会在赋值时唤醒传入值的retain消息。此属性只能用于Objective-C对象类型,而不能用于Core Foundation对象。(原因很明显,retain会增加对象的引用计数,而基本数据类型或者Core Foundation对象都没有引用计数——译者注)。 copy 对NSString 它指出,在赋值时使用传入值的一份拷贝。拷贝工作由copy方法执行,此属性只对那些实行了NSCopying协议的对象类型有效。更深入的讨论,请参考“复制”部分。
注释: 如果一个对象是你alloc或者new出来 的,你就需要调用release。如果使用autorelease,那么仅在发生过retain的时候release一次(让retain
count始终为1)。
@synthesize 如果没有实现setter和getter方法,编译器将会自动在生产setter和getter方法。 @dynamic 表示变量对应的属性访问器方法,是动态实现的,你需要在 NSObject中继承而来的+(BOOL) resolveInstanceMethod:(SEL) sel 方法中指定动态实现的方法或者函数。 属性修饰其他关键字: getter=getterName 指定get方法,并需要实现这个方法。必须返回与声明类型相同的变量,没有参数 setter=setterName 指定set方法,并需要实现这个方法。带一个与声明类型相同的参数,没有返回值(返回空值) 当声明为readonly的时候,不能指定set方法 |
|