2012-06-06 18 views
3

當內存壓力下會調用dealloc嗎?如果是這樣,是否在didReceiveMemoryWarning之前或之後調用?另外,當視圖控制器被釋放時,是否可以調用deallocdidReceiveMemoryWarning和dealloc之間的關係是什麼?

+0

順便說一句,模擬器讓我們模擬一個內存警告事件,所以你可以看到它的確切功能。只要在你的各種視圖控制器方法(例如viewDidLoad,viewDidUnload,dealloc,didReceiveMemoryWarning等)中放置NSLog語句等,你就會明白它在做什麼。 – Rob

回答

3

didReceiveMemoryWarning只是通知您內存不足。視圖和控制器都不被釋放。另一方面,在iOS 6之前,您可能同時收到viewDidUnload,這會通知您視圖已被刪除(但不是視圖控制器)。這就是爲什麼你重寫didReceiveMemoryWarning,所以你也可以釋放視圖控制器可以安全釋放的任何其他東西。但是這些內存不足的情況下,視圖控制器從未被釋放。最壞的情況下,如果調用viewDidUnload,視圖將被釋放,但不是控制器。

僅供參考,我從文檔報價:

內存是iOS中的關鍵資源,視圖控制器提供 內置在關鍵 次降低其內存佔用的支持。所述UIViewController類通過其didReceiveMemoryWarning方法, ,其釋放不需要的存儲器提供的 低內存條件的一些自動搬運。

當發生低內存警告時,如果它知道它可以重新加載或稍後再次重新創建,則它將清除其視圖 。如果 發生這種情況,[如果之前6.0上運行的IOS版本]它又稱viewWillUnloadviewDidUnload 方法給你的代碼有機會放棄與您的視圖層次結構相關的任何 對象的所有權,包括從加載 對象筆尖文件,在你的viewDidLoad 方法創建的對象,並在運行時懶洋洋地創建並添加到視圖 層次結構對象。

[didReceiveMemoryWarning]當系統確定的 可用存儲器的量低時被調用。此方法 的默認實現嘗試釋放視圖控制器的視圖[在6.0之前的iOS版本中]。要發佈, 視圖不能有超級視圖;也就是說,它不是視圖層次結構的組成部分。有關視圖如何卸載的更多信息,請參閱「The View Controller Life Cycle」

您可以重寫此方法以釋放您的視圖控制器使用的任何額外內存。如果這樣做,那麼執行此方法的方法 必須在某個時間調用超級實現以允許控制器發佈其視圖。如果您的視圖控制器對視圖層次結構中的視圖持有 引用,則應改爲在viewDidUnload方法中釋放這些 引用。

更新:

在回答您的其他問題(你可以不關心,現在你意識到視圖控制器都沒有,自己在調用didReceiveMemoryWarning發佈的時候),是時,該項目最終被釋放(並且保留計數爲零,即,該分配和所有各種保留現在被相應的發佈聲明抵消),則將調用dealloc

3

沒有關係,didReceiveMemoryWarning是給你刪除任何未所需的資源到內存不足情況作出反應的機會。

如果視圖控制器,或任何其他對象,被釋放並且它的保留計數減小到0,那麼它會被刪除,其的dealloc將被調用。

如果一個對象被釋放,但其保留計數不減少爲0,那麼就不會被刪除因而它的dealloc不會被調用。

當一個對象被刪除一個的dealloc被調用,刪除和發佈是不一樣的東西。當其保留計數達到0時刪除一個對象。

相關問題