ARC指南3 - @property

本章介紹引入ARC後@property的使用,跟ARC之前的還是很不一樣的


一、.h和.m文件的變化說明

1.對於.h頭文件,主要是將屬性定義由retain變爲strong

@property (retain, nonatomic)
變爲

@property (strong, nonatomic)

2.在ARC之前,我們經常在.m中使用分類拓展來增加私有的property

@interface MJViewController ()
@property (nonatomic, retain) NSArray *data;
@end
這樣做主要是簡化實例對象的手動內存管理,讓property的setter方法自動管理原來對象的釋放,以及新對象的retain。但是有了ARC,這樣的代碼就不再需要了。一般來說,僅僅爲了簡化內存管理,是不再需要使用property的,雖然你仍然可以這樣做,但直接使用實例變量是更好的選擇。只有那些屬於public的實例變量,才應該定義爲property

我們可以直接在.m類實現中定義private實例變量,不必寫分類拓展了:

@implementation MJViewController {
    NSArray *data;
}
不過還是要在viewDidUnload方法中將data設置爲nil,因爲data是個strong指針,當不再使用一個對象時,應該設置爲nil

- (void)viewDidUnload {
    [super viewDidUnload];
    data = nil;
}

二、IBOutlet

在ARC中,所有IBOutlet屬性都推薦使用weak, 這些view對象已經屬於View Controller的view hierarchy,不需要再次定義爲strong。因此,這些定義爲weak的IBOutlet屬性都不需要在IBOutlet中設置爲nil


三、@property的修飾符小結

• strong : 該屬性值對應 __strong 關鍵字,即該屬性所聲明的變量將成爲對象的持有者,等同於"retain"
• weak : 該屬性對應 __weak 關鍵字,與 __weak 定義的變量一致,該屬性所聲明的變量將沒有對象的所有權,並且當對象被釋放之後,對象將被自動賦值nil,記住IBOutlet應該使用weak
• unsafe_unretained : 等效於__unsafe_unretaind關鍵字聲明的變量,等同於之前的"assign",iOS 5之前的系統用該屬性代替 weak 來使用
• copy : 和之前的copy一樣,複製一個對象並創建strong關聯
• assign : 對象不能使用assign,但原始類型(BOOL、int、float)仍然可以使用



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章