示例1:
@property (nonatomic) BOOL property;
nonatomic表示不考慮多線程,編譯器不生成互斥加鎖的代碼,可以提高效率,缺點(diǎn)是在多線程環(huán)境下存在風(fēng)險(xiǎn),可能會(huì)出現(xiàn)讀寫不同步問題。
與之對(duì)應(yīng)的atomic則考慮多線程,編譯器會(huì)生成互斥加鎖的代碼,可以避免在多個(gè)線程下操作同一資源造成的死鎖、讀寫不同步問題,該屬性默認(rèn)實(shí)現(xiàn),如使用nonatomic則不實(shí)現(xiàn),缺點(diǎn)是效率低。
總結(jié):多線程使用atomic,單線程使用nonatomic。
注:以下示例僅在單線程環(huán)境下
示例2:
@property (nonatomic, assign) BOOL property;
等價(jià)于@property (nonatomic) BOOL property; assign是默認(rèn)類型,只能修飾基本類型和C數(shù)據(jù)類型,不改變引用計(jì)數(shù)。
tip: @property BOOL property; 等價(jià)于@property (atomic, assign) BOOL property;
示例3:
@property (nonatomic, retain) NSString *property;
@property (nonatomic, copy) NSString *property;
retain會(huì)在setter方法里將舊對(duì)象釋放并將舊對(duì)象的值賦給新對(duì)象,另外新對(duì)象的引用計(jì)數(shù)為1,指針指向新對(duì)象。copy和retain處理流程一樣,不同的是copy將新生成指針指向新對(duì)象,被定義有copy屬性的對(duì)象必須要符合NSCopying協(xié)議,必須實(shí)現(xiàn)- (id)copyWithZone:(NSZone *)zone方法。
示例4:
@property (nonatomic, strong) NSString *property;
@property (nonatomic, weak) NSString *property;
strong表示強(qiáng)引用,可以決定對(duì)象的生命周期,只要對(duì)象有強(qiáng)引用存在,就不會(huì)被釋放。
weak表示弱引用,不能決定對(duì)象的生命周期,只要對(duì)象不存在強(qiáng)引用,即使有多個(gè)弱引用存在,對(duì)象依然會(huì)被釋放。
示例5:
@property (nonatomic, assign, getter=methodget) BOOL property;
getter=methodget表示替換默認(rèn)setter方法,原setter方法不再有效,methodget方法內(nèi)部實(shí)現(xiàn)可重寫,類似getter方法也可以在聲明的時(shí)候替換如:@property (nonatomic, assign, getter=methodget, setter=methodSet:) BOOL property;
鑒于篇幅,屬性描述中還有其他聲明如unretain-unsafe以及ios9以后新出的nonnull、nullable之類這里不再介紹,如有描述不當(dāng)或者錯(cuò)誤的地方歡迎大家指正,共同提升。