示例1:
@property (nonatomic) BOOL property;
nonatomic表示不考虑多线程,编译器不生成互斥加锁的代码,可以提高效率,缺点是在多线程环境下存在风险,可能会出现读写不同步问题。
与之对应的atomic则考虑多线程,编译器会生成互斥加锁的代码,可以避免在多个线程下操作同一资源造成的死锁、读写不同步问题,该属性默认实现,如使用nonatomic则不实现,缺点是效率低。
总结:多线程使用atomic,单线程使用nonatomic。
注:以下示例仅在单线程环境下
示例2:
@property (nonatomic, assign) BOOL property;
等价于@property (nonatomic) BOOL property; assign是默认类型,只能修饰基本类型和C数据类型,不改变引用计数。
tip: @property BOOL property; 等价于@property (atomic, assign) BOOL property;
示例3:
@property (nonatomic, retain) NSString *property;
@property (nonatomic, copy) NSString *property;
retain会在setter方法里将旧对象释放并将旧对象的值赋给新对象,另外新对象的引用计数为1,指针指向新对象。copy和retain处理流程一样,不同的是copy将新生成指针指向新对象,被定义有copy属性的对象必须要符合NSCopying协议,必须实现- (id)copyWithZone:(NSZone *)zone方法。
示例4:
@property (nonatomic, strong) NSString *property;
@property (nonatomic, weak) NSString *property;
strong表示强引用,可以决定对象的生命周期,只要对象有强引用存在,就不会被释放。
weak表示弱引用,不能决定对象的生命周期,只要对象不存在强引用,即使有多个弱引用存在,对象依然会被释放。
示例5:
@property (nonatomic, assign, getter=methodget) BOOL property;
getter=methodget表示替换默认setter方法,原setter方法不再有效,methodget方法内部实现可重写,类似getter方法也可以在声明的时候替换如:@property (nonatomic, assign, getter=methodget, setter=methodSet:) BOOL property;
鉴于篇幅,属性描述中还有其他声明如unretain-unsafe以及ios9以后新出的nonnull、nullable之类这里不再介绍,如有描述不当或者错误的地方欢迎大家指正,共同提升。