示例1:
@property (nonatomic) BOOL property;
nonatomic表示不考慮多線(xiàn)程,編譯器不生成互斥加鎖的代碼,可以提高效率,缺點(diǎn)是在多線(xiàn)程環(huán)境下存在風(fēng)險(xiǎn),可能會(huì)出現(xiàn)讀寫(xiě)不同步問(wèn)題恋谭。
與之對(duì)應(yīng)的atomic則考慮多線(xiàn)程,編譯器會(huì)生成互斥加鎖的代碼挽鞠,可以避免在多個(gè)線(xiàn)程下操作同一資源造成的死鎖疚颊、讀寫(xiě)不同步問(wèn)題,該屬性默認(rèn)實(shí)現(xiàn)信认,如使用nonatomic則不實(shí)現(xiàn)材义,缺點(diǎn)是效率低。
總結(jié):多線(xiàn)程使用atomic嫁赏,單線(xiàn)程使用nonatomic其掂。
注:以下示例僅在單線(xiàn)程環(huán)境下
示例2:
@property (nonatomic, assign) BOOL property;
等價(jià)于@property (nonatomic) BOOL property; assign是默認(rèn)類(lèi)型,只能修飾基本類(lèi)型和C數(shù)據(jù)類(lèi)型潦蝇,不改變引用計(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)可重寫(xiě)本慕,類(lèi)似getter方法也可以在聲明的時(shí)候替換如:@property (nonatomic, assign, getter=methodget, setter=methodSet:) BOOL property;
鑒于篇幅,屬性描述中還有其他聲明如unretain-unsafe以及ios9以后新出的nonnull侧漓、nullable之類(lèi)這里不再介紹锅尘,如有描述不當(dāng)或者錯(cuò)誤的地方歡迎大家指正,共同提升布蔗。