2011-08-25 65 views
3

發佈蘋果模板提供了viewDidUnload此評論:多少在viewDidUnload

// Release any retained subviews of the main view. // e.g. self.myOutlet = nil;

所以我通常設置IB奧特萊斯nil在viewDidUnload然後dealloc釋放他們。問題是,我的所有其他保留的ivar對象,其中一些是以編程方式添加的視圖,而另一些則是數據模型,是否也應該在這兩種方法中處理它們?如果不是,爲什麼不呢?

從這個答案here我推測,只能查看相關的對象應該在viewDidUnload去爲=nil語句,可能應該包括非IB Outlet保留意見,是否正確?然後,所有其他對象,包括數據模型,在dealloc作爲release語句應該去。這是正常的做法嗎?

回答

1

viewDidUnload被稱爲低存儲器狀態的結果卸載爲視圖控制器當前不可見的圖。此時視圖控制器的視圖對象已被釋放,這意味着所有的已被釋放viewController.view的子視圖對象,但如果你是在高德留住他們,他們不會釋放。

您應該釋放視圖時再次加載或您可以根據需要輕鬆地重新創建的東西將被重新創建的任何對象。下一次使用視圖時,視圖將從NIB或通過調用loadView重新創建,因此您釋放的所有內容都將被重新創建。

當你的觀點來自筆尖都在NIB指定的視圖對象被創建並添加視圖控制器的視圖的子視圖。任何帶有IBOutlets的ivars都與這些子視圖相關聯,這樣您也可以「擁有」這些對象(您擁有這些對象)。你需要釋放這些ivars,以便它們實際上會被釋放。

當在編程的loadView創建你的觀點,你也應該放開你的高德保留了這些對象將在的loadView在下一次重新創建視圖的負荷。

同爲任何你在viewDidLoad中(或viewWillAppear中或其他地方),如數據模型建立,如果你可以重新創建它「容易」後,當再次查看負載或需要的對象時,那麼就應該在viewDidLoad中發佈減少內存使用量。實際上,對於非視圖項目,比如數據模型,我會在didReceiveMemoryWarning中發佈它。

分配零到使用的setter一個保留的屬性會導致釋放被髮送給他們,當你寫self.myOutlet = nil要調用其上實現了這樣的事情setter方法:

-(void)setMyOutlet:(id)newObject 
{ 
    [newObject retain];  // does nothing if newObject is nil 
    [myOutlet release];  
    myOutlet = newObject; 
} 
+0

如果ahve一個保留數據模型作爲視圖控制器的ivar,並且你希望這個數據在視圖控制器的視圖被卸載的情況下保存在內存中,這聽起來像viewDidLoad不是創建這個模型的好地方。你會推薦一個委託方法來創建視圖控制器的Ivars在這種情況下嗎?或者也許更傳統的方式是通過核心數據將數據保存在設備上。我的問題是數據模型從網上獲取其內容;釋放它需要下一次下載才能繼續使用它。 – johnbakers

+0

如果你從網上下載數據,我通常不會稱那些「簡單」重新創建的東西。我不會釋放它,否則會根據其大小和結構將其存儲在覈心數據,plist或NSUserDefault或SQL DB中。 – progrmr