atomic和nonatomic的主要區(qū)別在于系統(tǒng)生成的getter和setter方法不同。
atomic:
- 聲明屬性時(shí)在不添加atomic和nonatomic的情況下费什,默認(rèn)是atomic
- 對(duì)同一對(duì)象的set和get是順序執(zhí)行的
- 速度較慢,因?yàn)橐WC操作整體完成
- 線程安全(但也不是絕對(duì)安全),需要消耗大量的系統(tǒng)資源來(lái)為屬性加鎖。
nonatomic:
- 不是默認(rèn)的
- 線程不安全
- 更快
@property (atomic , strong) NSString *name;
如果:
線程A調(diào)用[self setName:@""]
線程B調(diào)用[self setName:@""]
線程C調(diào)用[self name]
所有這些線程上的操做都會(huì)依次順序執(zhí)行扑毡,也就是說(shuō)其中一個(gè)線程在執(zhí)行g(shù)etter或setter操作時(shí),其他線程必須等待证鸥,所以name屬性的讀/寫(xiě)是安全的僚楞。
線程D調(diào)用[name release]
可能會(huì)造成crash勤晚,因?yàn)閞elease不受getter或setter操作的限制枉层。因此atomic只是讀寫(xiě)安全,并不能保證線程安全赐写,因?yàn)閯e的線程還能進(jìn)行讀寫(xiě)之外的操作鸟蜡。