我有一個基於導航的iPhone應用程序。在應用程序的中間,有時我正在接收內存警告級別1和2.突然間,我從數據庫中獲取的所有值都基於根視圖控制器中的用戶輸入創建,包括保存在nsuserdefaults中的值完全失敗。當我嘗試回到根視圖控制器時,我有空表視圖沒有任何數據。iPhone中的內存警告釋放iPhone中的數據庫所有值
如何處理此問題,請提出解決此問題的任何解決方案?
我有一個基於導航的iPhone應用程序。在應用程序的中間,有時我正在接收內存警告級別1和2.突然間,我從數據庫中獲取的所有值都基於根視圖控制器中的用戶輸入創建,包括保存在nsuserdefaults中的值完全失敗。當我嘗試回到根視圖控制器時,我有空表視圖沒有任何數據。iPhone中的內存警告釋放iPhone中的數據庫所有值
如何處理此問題,請提出解決此問題的任何解決方案?
這是它的工作原理,「不幸」。當didReceiveMemoryWarning
進來時,您的觀點被釋放,這解釋了爲什麼你沒有在表中找到任何價值。
根據Apple Docs,應該做的是準備再次創建所有視圖。
此方法的默認實現檢查視圖控制器是否可以安全地釋放其視圖。如果視圖本身沒有超級視圖,並且可以從nib文件或使用自定義的loadView方法重新加載,則這是可能的。如果可以釋放視圖,則此方法釋放視圖並調用viewDidUnload方法。
您可以重寫此方法(根據需要)釋放視圖控制器使用的任何其他內存。如果這樣做,一定要在某個時刻調用超級實現來允許視圖控制器釋放其視圖。在iOS 3.0和更高版本中,如果您的視圖控制器持有對視圖層次結構中對象的引用,則應該在viewDidUnload方法中釋放這些引用。在iOS的早期版本中,您應該繼續從此方法中釋放它們。有關如何安全釋放插座和其他對象的信息,請參閱viewDidUnload方法中的討論。
如果你想實現這些準則,很長的路要走是:
使用viewDidLoad
/viewDidUnload
爲 「保存/恢復」 你的數據;
將您的數據存儲在獨立於您的視圖的模型中;
在viewDidUnload
(在警告後調用)在控制器中存儲了有關視圖狀態的足夠信息(即,是否顯示關於客戶的數據,他的客戶/ ID),以便您可以通過從模型中獲取數據;
in viewDidLoad
,在內存警告後恢復視圖時也會調用,使用您保存在視圖控制器中的信息(如果它存在),以確切的狀態重新創建視圖(否則,將其置於默認狀態)。
這應該很容易。如果是有意義的你,你可以部署
一個竅門是:在您的視圖控制器
覆蓋-didReceiveMemoryWarning
;
對於任何您不希望自動發佈的視圖,請勿在-didReceiveMemoryWarning
覆蓋中調用[super didReceiveMemoryWarning]
。
請注意,這會讓你的生活更輕鬆,但同時也會打敗蘋果公司在那裏恢復記憶的重要機制。這本身不會產生崩潰,但如果您管理很多視圖或視圖是內存密集型的(大量圖形等),則可能會使設備內存填滿,並且應用程序會突然關閉。所以,你的判斷在這裏...
感謝您的寶貴信息。它確實幫助了我很多。再次感謝 – 2011-05-27 07:19:55
我還有一個問題,如果我刪除[超didReceiveMemoryWarning]它不會導致應用程序崩潰的權利。目前,即使我丟失了內存中的值,我的應用程序並沒有崩潰 – 2011-05-27 07:22:19
請參閱我的編輯:我添加了正確的操作指南(蘋果報價下方),並回答了最後一個問題。 – sergio 2011-05-27 07:45:20