示例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之類這里不再介紹,如有描述不當或者錯誤的地方歡迎大家指正,共同提升。