2012-02-18 47 views
1

我對使用屬性有一些疑問。通過閱讀ARC轉換文件,應該使用強和弱代替保留和分配。通過與自動生成的代碼比較瞭解@property屬性Xcode 4

但是,至少有兩種情況,Xcode自動生成的代碼正在做其他事情。我想知道這是否僅僅是來自Xcode的'尚未更新'的工具,或者如果我錯過了一些東西。

第一種情況是使用核心數據管理對象自動生成。

已經創建的相關類之後,這是出現在.h文件中:

@property(nonatomic,retain) NSString *myProperty; 

什麼是編譯器在這種情況下做什麼?將retain替換爲strong

但奇怪的情況下(我的知識的缺乏)是IBOutlet,自動生成的代碼與.h文件中的連接接口生成器出口時是這樣的:

@property (unsafe_unretained, nonatomic) IBOutlet UILabel *myOutlet; 

,並再次這似乎從不同推薦'弱'屬性。我的意思是用戶在各種論壇上推薦。

,這在viewDidUnload:

- (void)viewDidUnload { 
    [self setMyOutlet:nil]; 
} 

加入爲什麼我們需要這種說法?即使通過運行探查儀器,也沒有任何內存泄漏或其他內存問題的痕跡?我的意思是,沒有設置爲nil一切正常。

回答

1

unsafe_unretained將存儲不安全指針,即當標籤消失時指針仍然存在,但它會指向一些垃圾。這就是爲什麼-viewDidUnload代碼將該指針重置爲nil的原因。當它指向的對象消失時,使用weak屬性將自動將指針值變爲nil。這就是推薦的原因。

retainstrong基本上是一樣的東西。該對象被保留,即,直到該屬性被設置爲另一個值(例如,nil),在該對象被釋放的時刻,該對象不會消失。

+1

小增加:在ARC中,unsafe_unretained與non-ARC中的assign相同。如果你不瞄準iOS4,根本就沒有真正的理由使用'unsafe_unretained'。此屬性說明符是爲了在iOS4上允許ARC而引入的。 – 2012-02-18 09:52:46