iOS應(yīng)用開發(fā):ARC之@property使用
所有者屬性
我們先來看看與所有權(quán)有關(guān)系的屬性,關(guān)鍵字間的對應(yīng)關(guān)系。
屬性值 | 關(guān)鍵字 | 所有權(quán) |
---|---|---|
strong | __strong | 有 |
weak | __weak | 無 |
unsafe_unretained | __unsafe_unretained | 無 |
copy | __strong | 有 |
assign | __unsafe_unretained | 無 |
retain | __strong | 有 |
strong
該屬性值對應(yīng) __strong 關(guān)鍵字,即該屬性所聲明的變量將成為對象的持有者。
weak
該屬性對應(yīng) __weak 關(guān)鍵字,與 __weak 定義的變量一致,該屬性所聲明的變量將沒有對象的所有權(quán),并且當對象被破棄之后,對象將被自動賦值nil。
并且,delegate 和 Outlet 應(yīng)該用 weak 屬性來聲明。同時,如上一回介紹的 iOS 5 之前的版本是沒有 __weak 關(guān)鍵字的,所以 weak 屬性是不能使用的。這種情況我們使用 unsafe_unretained。
unsafe_unretained
等效于__unsafe_unretaind關(guān)鍵字聲明的變量;像上面說明的,iOS 5之前的系統(tǒng)用該屬性代替 weak 來使用。
copy
與 strong 的區(qū)別是聲明變量是拷貝對象的持有者。
assign
一般Scalar Varible用該屬性聲明,比如,int, BOOL。
retain
該屬性與 strong 一致;只是可讀性更強一些。
讀寫相關(guān)的屬性 (readwrite, readonly)
讀寫相關(guān)的屬性有 readwrite 和 readonly 兩種,如果使用ARC之后,我么需要注意一下 readonly 屬性的使用。
比如下面的變量聲明。
- @property (nonatomic, readonly) NSString *name;
一般聲明為 readonly 的變量按理說應(yīng)該不需要持有所有權(quán)了,但是在ARC有效的情況下,將出現(xiàn)下面的錯誤信息 :
“ARC forbids synthesizing a property of an Objective-C object with unspecified ownership or storage attribute |
- @property (nonatomic, strong, readonly) NSString *name;
不過有一點,Scalar Varible的變量缺省都有 assign 的屬性定義,所以不需要給他們單獨的明示聲明了。