2010-07-10 40 views
1

當我們需要釋放一個對象時,可以在dealloc方法中或在viewController的ViewDidUnload中執行它?哪個更好?在哪裏釋放一個對象? dealloc或ViewDidUNload

我認爲viewDidUnload會做得更好,因爲一旦視圖控制器被卸載,對象將被釋放。並且在的dealloc情況下,從documentation

當一個應用程序終止, 對象可以不被髮送的dealloc 消息。因爲進程的內存 在退出時會自動清除,所以 只是爲了允許操作系統清理資源 比調用所有內存管理方法更高效。

對象在應用程序退出時可能不會發送dealloc消息。

所以我覺得如果對象早些時候發佈,會比推遲發佈時間更好,從而減少應用程序佔用的內存空間。

如果我的理解錯誤,請糾正我。

感謝和問候, 克里希南

回答

6

是的,你的理解是錯誤的。

首先,應用程序退出時會發生什麼並不重要,因爲操作系統將釋放您的應用程序分配的所有內存。在應用程序終止時不調用dealloc只是蘋果公司加速實現的方式。

其次,它是不是視圖控制器viewDidUnload被稱爲是被卸載,但只有其觀點。視圖控制器一直處於活動狀態,直到它被釋放。

viewDidUnload,你必須釋放那些能夠並且將在viewDidLoad重新創建(因爲viewDidLoad將會再次調用時,視圖控制器需要重新創建視圖)認爲,一切的一部分對象。這包括你所有的網點。您還必須將這些變量設置爲nil以避免過度釋放它們。

因爲在dealloc中,您應該釋放視圖控制器保留的所有對象,包括您在viewDidUnload中包含的所有對象。

看看蘋果的任何示例代碼,看看蘋果如何做到這一點。

+0

嗨,Ole,謝謝你的回覆。現在我明白了,我應該在ViewDidUnload中發佈,我在ViewDIdLoad中創建了什麼。 有一個疑問,我有應該在-dealloc方法中釋放一些已經在-ViewDidUnload方法中發佈的東西。因爲當我的-dealloc被調用時,視圖應該被刪除,並且-viewDidUnload必須被調用。所以我想這會是代碼的重複。 請分享你的想法。謝謝 關心, 克里希南。 – Krishnan 2010-07-13 09:25:43

+0

Apple在其所有示例代碼中都有此重複發佈模式,所以我建議您按照他們的示例進行操作。從文檔中不清楚'viewDidUnload'是否總是在'dealloc'之前被調用。在'viewDidUnload'中將變量設置爲'nil'以避免過度釋放對象也很重要。 – 2010-07-13 10:13:44

+0

好的,謝謝Ole Begemann。我會使用蘋果公司的任何產品。 – Krishnan 2010-07-13 14:57:49

1

你必須採取在考慮,從iOS 6中

viewDidUnload

不會被調用,從蘋果:

此前的iOS 6,當低出現內存警告,如果UIViewController類知道它可以重新加載,則清除它的視圖,或者稍後再次重新創建它們。如果發生這種情況,它又稱 viewWillUnload和viewDidUnload方法給你的代碼有機會 放棄與您的觀點 層次結構相關聯的任何對象,包括從筆尖文件加載對象的所有權,創造 對象在viewDidLoad方法,以及在運行時緩慢創建的對象以及添加到視圖層次結構中的對象 。在iOS 6上,視圖永遠不會被清除,並且這些方法從不會被調用。如果您的視圖控制器需要 在內存不足時執行特定任務,它應該覆蓋 didReceiveMemoryWarning方法。

相關問題