2012-08-24 82 views
6

我是iphone開發新手。我正在爲我的項目使用ARC。據我瞭解使用ARC我們不必手動發佈任何對象。但是,我在某些地方觀察到,即使在使用ARC之後,人們也明確地將其對象設置爲ViewDidUnload中的零。ARC下的-viewDidUnload中的弱和強屬性

例如,在.h文件中我有這樣的事情:

@property (unsafe_unretained, nonatomic) IBOutlet MKMapView *mapViewOutlet; 
@property (unsafe_unretained, nonatomic) IBOutlet UIToolbar *toolBar; 
@property (strong,nonatomic) NSMutableArray *dataArray; 

而且.M如下:

- (void)viewDidUnload 
{ 
    [self setMapViewOutlet:nil]; 
    [self setToolBar:nil]; 
    [super viewDidUnload]; 
    self.dataArray=nil; 
} 

我的問題是,是不是真的有必要明確指定爲零ViewDidUnload甚至在ARC下?

回答

10

viewDidUnload方法的全部要點是釋放您不真正需要的數據,以釋放內存。讀the documentation

當低內存條件發生並且不需要當前視圖控制器的 視圖,該系統可以選擇從 內存中刪除這些看法。這個方法在視圖控制器的視圖 被釋放後調用,並且是您執行任何最終清理的機會。如果您的視圖控制器存儲對視圖或其子視圖的單獨引用,則應使用此方法來釋放這些引用。您還可以使用此方法刪除對您創建的任何對象的引用,以支持該視圖,但現在不再需要該視圖,因爲該視圖不再需要。您不應該使用此方法釋放用戶數據或任何其他無法輕易重新創建的信息。

所以你爲了釋放對象現在和幫助系統釋放一些內存設置屬性nil。但是,這當然取決於房產類型 - 強大的房產屬於「您的」房產,只有您現在可以決定是否放行(設置爲nil)。例如,如果它們指向與主視圖一起發佈的一些視圖,則弱屬性可能已經是nil。而unsafe_unretained屬性是一個特殊的野獸。他們指向的對象可能已經被釋放,但這並不意味着它們被自動設置爲nil。因此,您應該使用其中一種「安全」屬性類型(強/弱),或者在此處將不安全屬性設置爲nil,以確保您稍後不會使用發佈的對象。在這種情況下沒有硬性規定,你必須考慮這種情況以及它對各種財產的意義。

順便說一下,viewDidUnload在iOS 6中不再使用,其中不再在低內存條件下發布視圖。您仍然收到didReceiveMemoryWarning回撥,以便您可以在此發佈一些資源。同樣,我建議你閱讀文檔並進行一些測試,看看會發生什麼,並決定你應該做什麼。

+0

但是,即使我沒有設置爲零,系統會自動釋放ARC中的內存嗎? – Raj

+0

最後,是的。在ARC下創建泄漏很難(呃)。您的決定是否可以在應用程序收到內存警告時通過釋放大量內存來幫助系統。 – zoul

+0

好的。我會接受這個答案。 – Raj

2

當您使用unsafe_unretained,你應該將其分配到零,因爲它不會被分配給無隱,這裏是弱引用情況下,它會爲了避免任何懸而未決的引用,你需要在unsafe_unretained的情況下賦值爲nil。

+0

是的,我甚至都這麼想。但是我曾經在一些地方看到,即使是弱的參考設置爲零。在我的問題中,你甚至可以看到強參考設置爲零。 – Raj

3

ARC將只發布不具有強引用的對象的屬性。在你的情況下,這些都是強大的引用,所以它們將被保留,除非它們被明確設置爲零。

viewDidUnload方法並不意味着您的UIViewController從內存中刪除,它只是意味着其視圖從內存中刪除(iOS Developer - ViewController lifecycle)。

在這種情況下,您的UIViewController仍然保留在內存中,因此也保留其屬性,除非它們明確設置爲零。

+0

在我的情況下,他們並不都是強有力的參考。對於你的信息,IOS4不支持weak,我們使用unsafe-unretained,這可能會在一段時間內創建懸掛指針。明智的功能都是一樣的 – Raj

+0

正確,對不起,我正在尋找弱關鍵字(現在只爲iOS5開發)。 – Resh32

+0

,據我所知,ARC會自動調用dealloc獲取強引用。因此,我們不必將它們設置爲零。除了弱引用,我們將它設置爲零,以避免懸掛指針在某些情況下可能是可能的 – Raj