iPhone開發之深刻淺出 (2) — ARC之@property使用

上一回咱們學到了一些ARC的基本概念,這一次咱們來看看ARC對@property的使用規則有何影響。 atom

全部者屬性

咱們先來看看與全部權有關係的屬性,關鍵字間的對應關係。 spa

屬性值 關鍵字 全部權
strong __strong
weak __weak
unsafe_unretained __unsafe_unretained
copy __strong
assign __unsafe_unretained
retain __strong
strong該屬性值對應 __strong 關鍵字,即該屬性所聲明的變量將成爲對象的持有者。 weak該屬性對應 __weak 關鍵字,與 __weak 定義的變量一致,該屬性所聲明的變量將沒有對象的全部權,而且當對象被破棄以後,對象將被自動賦值nil。而且,delegate 和 Outlet 應該用 weak 屬性來聲明。同時,如上一回介紹的 iOS 5 以前的版本是沒有 __weak 關鍵字的,因此 weak 屬性是不能使用的。這種狀況咱們使用 unsafe_unretained。 unsafe_unretained等效於__unsafe_unretaind關鍵字聲明的變量;像上面說明的,iOS 5以前的系統用該屬性代替 weak 來使用。 copy與 strong 的區別是聲明變量是拷貝對象的持有者。 assign通常Scalar Varible用該屬性聲明,好比,int, BOOL。 retain該屬性與 strong 一致;只是可讀性更強一些。

讀寫相關的屬性 (readwrite, readonly)

讀寫相關的屬性有 readwrite 和 readonly 兩種,若是使用ARC以後,我麼須要注意一下 readonly 屬性的使用。 code

好比下面的變量聲明。 對象

@property (nonatomic, readonly) NSString *name;

通常聲明爲 readonly 的變量按理說應該不須要持有全部權了,可是在ARC有效的狀況下,將出現下面的錯誤信息 : ip

「ARC forbids synthesizing a property of an Objective-C object with unspecified ownership or storage attribute」 ci

若是定義了ARC有效,那麼必需要有全部者屬性的定義;因此咱們的代碼改爲這樣,就OK了 it

@property (nonatomic, strong, readonly) NSString *name;

不過有一點,Scalar Varible的變量缺省都有 assign 的屬性定義,因此不須要給他們單獨的明示聲明瞭。 table

相關文章
相關標籤/搜索