0

當我調試我的iPad應用程序時,我發現由於內存不足,某些視圖控制器的viewDidUnload被調用。但幾秒鐘後,他們的viewDidLoad被調用。然後再次因爲內存不足,viewDidUnload,然後再次viewDidLoad。這就像文件系統由於內存不足而保持交換文件。viewDidUnload在dealloc之後調用?

它應該是這樣,還是我做錯了什麼?

然後我想釋放視圖控制器擺脫這一點。但有時viewDidUnloaddealloc之前被調用,然後由於選擇器發送到解除分配的視圖控制器而崩潰。

謝謝你的幫助。

+0

呃,剛發佈這個問題後,我剛剛得到了第一部分。我使用controller的view屬性作爲[view removeFromSuperview],如果視圖不在內存中,它將加載該視圖。使用[controller isViewLoaded]將解決它。 – Kail 2011-02-18 09:01:19

+0

我閱讀了文檔,並發現view屬性的訪問會導致視圖被加載,但是。我希望文檔hightlight這是儘可能多的,大聲笑 – Kail 2011-02-18 09:10:21

回答

0

這是完全正常的行爲。 viewDidUnload在內存不足情況下調用以通知您的控制器視圖已被釋放。

View Controller Programming Guide for iOS中有一個清晰的步驟概述。

特別地,看在部分Understanding How Views Are Loaded and Unloaded,在那裏它覆蓋卸載循環詳述的步驟:

  1. 該應用程序接收到一個低存儲器從系統警告。

  2. 每個視圖控制器調用它的didReceiveMemoryWarning方法。如果您重寫此方法,則應該使用它來釋放您的視圖控制器對象不再需要的任何內存或 對象。不要使用 來釋放視圖控制器的視圖。您必須在您的實施中的某個 點處調用super,以確保運行默認實現 。默認實現嘗試釋放視圖。

  3. 如果視圖無法安全釋放(例如,它在屏幕上可見),則默認實現返回。

  4. 視圖控制器調用其viewWillUnload方法來通知子類視圖即將被刪除。子視圖 通常會在視圖銷燬之前需要保存 任何視圖屬性時覆蓋viewWillUnload方法。

等等。

在你的具體情況下,你肯定是不要想在這種情況下釋放視圖控制器。如果在內存不足的情況下需要進一步執行內存管理,則應該覆蓋默認實現didReceiveMemoryWarning。正如文檔所述,不要忘記撥打[super didReceiveMemoryWarning];

相關問題