2012年11月17日 星期六

自動合成屬性

在XCode 4.2之前的版本,我們在.h文件裡宣告屬性@property後,還需要在.m文件中合成@synthesize,很麻煩。

現在,我們只需要宣告 @property name 即可,Xcode會自動合成 @synthesize name = _name。
@property (attribute1, attribute2) propertyName;

與所有權有關係的屬性,關鍵字間的對應關係。
屬性值關鍵字所有權說明
strong __strong add reference to keep object alive
weak __weak object can disappear, become nil
unsafe_unretained __unsafe_unretained
copy __strong make copy on assign
assign __unsafe_unretained normal assign, no reference
retain __strong


nonatomic : make not hreadsafe, increase perf


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 : create getter & setter (default)
readonly : create getter only

讀寫相關的屬性有 readwrite 和 readonly 兩種,如果使用ARC之後,我麼需要注意一下 readonly 屬性的使用。

比如下面的變量宣告。
@property (nonatomic, readonly) NSString *name;

一般宣告為 readonly 的變量照理說應該不需要持有所有權了,但是在ARC有效的情況下,將出現下面的錯誤信息 :
「ARC forbids synthesizing a property of an Objective-C object with unspecified ownership or storage attribute」
如果定義了ARC 有效,那麼必須要有所有者屬性的定義;所以我們的程式碼要改成這樣
@property (nonatomic, strong, readonly) NSString *name;

不過有一點,Scalar Variable 的變量都有 assign 的屬性定義,所以不需要給他們單獨的宣告。

沒有留言:

張貼留言