本章介紹引入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)仍然可以使用