strong, weak, assign, copy, nonatomic, atomic, unsafe_unretained, retain.
strong
指向并拥有该对象,引用计数加1,释放一次,引用计数减1,计数为0时被销毁。强行置为nil也可以销毁。
weak
指向该对象,引用计数不会增加,该对象在内存中会自动被销毁。
assign
主要用于修饰基本数据类型,如NSInteger, CGFloat, BOOL,这些值主要存在于栈中。如果修饰对象,在对象被释放后,指针地址依然存在,造成“野指针”,在堆中容易造成崩溃。在栈中的内存系统会自动处理,不会造成“野指针”。
copy
与strong类似。不同的是copy的复制是每次会在内存中复制一份对象,指针指向不同地址。一般用于修饰有对应可变类型的不可变对象,如NSString, NSArray, NSDictionary。
nonatomic
修饰的对象不保证setter和getter的完整性,当多个线程访问它时,可能会返回未初始化的对象。因此nonatomic比atomic的速度快,但是线程也是不安全的。
atomic
修饰的对象会保证setter和getter的完整性,任何线程访问它都可以得到一个完整的初始化对象。因为要保证操作完成,所以速度比较慢。atomic比nonatomic安全,但也不是绝对的线程安全,例如,当多个线程同时调用set和get时,就会导致获得的对象值不一致。要想线程绝对安全,就要用@synchronized。
unsafe_unretained
指定了 __unsafe_unretained 关系。因为 assign 和 unsafe_unretained 只进行值复制而没有任何实质性的检查,所以它们只应该用于值类型(BOOL、NSInteger、NSUInteger 等)。应避免将它们用于引用类型,尤其是指针类型,如 NSString * 和 UIView * 等。
retain
指定了 __strong 关系。ARC之前属性构造器的关键字是retain, copy, assign, strong和weak是ARC引入的关键字。retain现在同strong,就是指针指向值地址,同时进行引用计数加1。在ARC中常使用strong。