一、线程相关:
【atomic/nonatomic】
(1)atomic[默认属性]:OC使用的一种线程保护技术,是防止在写未完成的时候被另外一个线程读取,造成数据错误。而这种机制是耗费系统资源的,所以在iPhone这种小型设备上,如果没有使用多线程间的通讯编程,那么nonatomic是一个非常好的选择。
(2)nonatomic:非原子性访问,属性赋值的时候不加锁,多线程并发访问会提高性能。但可能会造成不安全。如果不加该属性,则默认setter/getter两个方法都是原子性事务访问。所以,atomic和nonatomic用来决定编译器生成的getter,setter是否为原子操作。
二、赋值相关:
assign 默认(缺省) 基本数据类型的赋值
retain 对象的属性声明,引用计数加1
copy 对象的属性声明,赋值一个新的对象,但是引用对象不变
copy 和retain主要用于手动管理内存,但是也可以用于自动管理内存
ARC下使用
strong 增加一个对象的引用权限(引用计数加1)
weak 不会增加一个对象的引用权限,也是用于对象
基本使用规则:
非对象类型 使用assign 可以省略不写
对象类型 使用 retain/strong
NSString 使用copy/strong
总结:assign就是直接赋值,从而可能引起1中的问题,当数据为int,float等原生类型时,可以使用assign。retain使用了引用计数,retain引起引用计数+1,release引起引用计数-1.当引用计数为0时,dealloc函数被调用,内存被回收
【strong和weak】/ ARC下使用
(1)strong[默认值]:表明这是一个强引用。相当于retain属性。只要引用存在,对象就不能被销毁。当所有强引用消除时,对象才能被释放。
(2)weak:弱引用。相当于assign属性。一般为了避免retain cycles(就是父类中含有子类,父类retain了子类;子类中又调用了父类,子类又retain了父类),导致无法release,才会使用weak。
小结:(ARC下)你是不能使用retain,release,autorelease这些方法的,因为ARC会在必要的地方自动插入这些语句。所以我们需要在对象属性加上strong或者weak。
例子如下:
@property(nonatomic,assign) NSInteger number