2010-05-24 57 views
0

我正在向自己的應用程序引入自動旋轉功能,並且出現內存警告問題。無論我如何開始我的應用程序,只要設備保持該方向,我就不會收到內存警告。但是,第一次旋轉設備時,控制檯上出現以下警告:Safari發出內存級警告,除活動狀態以外的所有文檔都被殺死。當發生這種情況時,所有視圖控制器(除了被查看的視圖控制器都會被卸載)將被卸載 - 這在導航回視圖控制器時會產生意外的行爲,這些控制器通常應該已經在堆棧上。該應用程序永遠不會崩潰,並在第一次旋轉時發生此警告一次,之後它永遠不會發生(直到我停止/再次啓動應用程序)。另外,這隻發生在設備上 - 在模擬器中運行時沒有內存警告。iPhone旋轉導致內存警告

有沒有人看到這種行爲?在任何情況下,沒有人有任何建議,我可能會嘗試刪除內存警告。

在此先感謝。

回答

2

你不能假設內存警告永遠不會發生;你必須優雅地處理它們。意見建議:

  • 檢查與泄漏內存泄漏(注意它沒有捕獲所有泄漏)。
  • 修復您的視圖控制器以處理視圖重新加載。特別是(除非你重寫 - (void)loadView),它會在內存警告時調用 - (void)viewDidUnload,當它再次變爲可見時,它將調用 - (void)viewDidLoad。您可以通過在視圖控制器中保存狀態並將其恢復到 - (void)viewDidLoad中的視圖來解決此問題。
  • 如果您不能處理內存警告,請執行 - (void)didReceiveMemoryWarning並且不要超級調用(即註釋掉[super didReceiveMemoryWarning])。這是懶惰的,如果你的應用程序使用了太多的內存(像Safari和Phone這樣的後臺應用程序會先被殺掉),可能會導致崩潰。

您可以使用模擬器中的「模擬存儲器警告」選項來測試存儲器警告行爲。

0

由於內存有限,內存警告是iOS正常行爲的一部分,尤其是現在多任務支持。

UIKit不僅允許從視圖控制器返回導航,還允許從現有視圖導航到其他視圖控制器。在這種情況下,將分配一個新的UIViewController,然後將其加載到視圖中。舊的視圖控制器將離開屏幕並變爲非活動狀態,但仍擁有許多對象 - 一些位於自定義屬性和變量中,另一些位於視圖屬性/層次結構中。新的可見視圖控制器對於其視圖對象也是如此。

由於移動設備的內存量有限,擁有這兩組對象(一個位於屏幕外視圖控制器和另一個位於屏幕視圖控制器中)可能太多,無法處理。如果UIKit認爲它是必要的,它可以回收一些屏幕外視圖控制器的內存,而這些內存不會顯示; UIKit知道哪個視圖控制器在屏幕上,哪個是屏幕外的,畢竟它是管理它們的人(當你調用presentModalViewController:animated:或dismissModalViewControllerAnimated :)。因此,每次感覺到壓力時,UIKit都會生成內存警告,從視圖層次結構中卸載並釋放離屏視圖,然後調用您的自定義viewDidUnload方法,以便爲屬性和變量執行相同的操作。 UIKit自動發佈self.view,允許我們在我們的viewDidUnload代碼中手動發佈我們的變量和屬性。它適用於所有離屏視圖控制器。

當系統內存不足時,它會觸發didReceiveMemoryWarning。出現內存警告時,離屏視圖將被回收並釋放,但屏幕視圖不會被釋放 - 它是可見的並且是需要的。如果你的類擁有大量內存,比如緩存,圖像等,didReceiveMemoryWarning是你應該清除它們的地方,即使它們在屏幕上。否則,您的應用程序可能會因爲系統資源過剩而終止。您需要重寫此方法以確保清理內存;只記得你打電話給[超級didReceiveMemoryWarning];。

更詳細的解釋可以在這裏找到:http://myok12.wordpress.com/2010/11/30/custom-uiviewcontrollers-their-views-and-their-memory-management/