2010-12-04 34 views
11

從Apple的View Controller編程指南/高效管理內存;didReceiveMemoryWarning和viewDidUnload

didReceiveMemoryWarning

使用此方法來取消分配與您的視圖控制器相關聯的所有非關鍵的自定義數據結構。雖然您不會使用此方法來釋放對視圖對象的引用,但您可以使用它來釋放您尚未在viewDidUnload方法中釋放的任何與視圖相關的數據結構。 (視圖對象本身應始終在viewDidUnload方法被釋放。)

viewDidUnload

可以使用viewDidUnload方法來解除對其的看法,具體的,可重新如果很輕鬆了任何數據視圖再次加載到內存中。但是,如果重新創建數據可能太耗時,則不必在此處釋放相應的數據對象。相反,您應該考慮在您的didReceiveMemoryWarning方法中釋放這些對象。

http://developer.apple.com/library/ios/#featuredarticles/ViewControllerPGforiPhoneOS/BasicViewControllers/BasicViewControllers.html

  1. 對於didReceiveMemoryWarning,我們建議取消分配非關鍵數據結構。那麼,什麼是關鍵,什麼是非關鍵?

  2. 此外,它說,釋放我們尚未在viewDidUnload釋放。 但是,當有內存警告didReceiveMemoryWarning被調用和視圖可以被卸載,然後調用viewDidUnload。那麼,它是在談論將這些代碼移動到前一個事件的方法(didReceiveMemoryWarning)還是我錯過了關於事件順序的事情?

  3. 對於viewDidUnload,我們建議關心容易重新加載視圖時重新創建數據。 因此,如果某個視圖正在使用且無法卸載,那麼爲什麼我們會在didReceiveMemoryWarning中釋放耗時的數據?在這些數據發佈之後,當用戶嘗試在當前視圖內執行某些操作時,加載它們也將非常耗時。所有的

回答

16

首先,這些只是指導方針,所以如果你不認爲這是有道理的,以釋放didReceiveMemoryWarning東西那就不要去做。但請記住,如果您的應用程序是首先引起內存警告的應用程序,那麼它最終只會被操作系統終止。

重新(1):臨界與非臨界完全是你的呼叫。只有你能真正確定你認爲哪些數據是你認爲關鍵的。雖然它可能與你的(3)密切相關,也就是說,容易重新創建的東西可能不是太關鍵。

重新(2):我不認爲這個陳述是針對調用的順序。正如你已經意識到,在一般情況下,viewDidUnload會後didReceiveMemoryWarning得到所謂的(因爲didReceiveMemoryWarning可引起viewDidUnload被調用)。例如,在viewDidUnload中,將釋放從nib中保存到UI元素的引用。所以不要在didReceiveMemoryWarning中發佈它們。(3):如果一個視圖正在使用中,因此無法卸載,那麼是的,顯然在didReceiveMemoryWarning中釋放視圖沒有多大意義。但是,實際上您可能有一些視圖無法卸載的實例,但已知其不可見(不是非常正常),在這種情況下,卸載它的數據並在視圖再次可見時重新創建它可能會有意義。

此外,我同意「相反,你應該考慮......」的言論有點奇怪,但我認爲推薦數據的要點在didReceiveMemoryWarning中發佈的原因是,如果你收到這些警告,那麼你自己的應用程序可能有被終止的危險。因此,雖然目前情況下viewDidUnload可能總是被稱爲內存警告的結果,但未來可能並非總是如此,因此從概念上講,釋放didReceiveMemoryWarning本身中的數據更有意義。在didReceiveMemoryWarning你知道有內存壓力,在viewDidUnload你可能沒有。因此,雖然這些數據確實很難重新創建,但這可能比終止應用程序更好。對用戶來說,它會顯示爲應用程序崩潰。

我個人的做法,以這些方法一般是這樣的:

  • viewDidUnload - 釋放從筆尖加載UI元素的任何引用。發佈我在viewDidLoad中創建的所有UI元素。
  • didReceiveMemoryWarning - 發佈用戶界面演示中使用的任何數據,我可以在再次調用viewDidLoad(或某個其他特定於應用程序的事件)時重新創建該數據。不要發佈任何我無法重建的東西。
+0

正如你指出的那樣,他們稱之爲對應物,但沒有記憶警告就不叫它。 – lockedscope 2010-12-04 16:17:59

1

我正在構建的應用程序是圖形密集型的,無論是在佈局鑲邊方面,還是與我正在下載和顯示的數據相關的圖像。

我的didReceiveMemoryWarning方法都是關於確定我在內存中保留哪些圖像,但目前沒有顯示,並將它們從內存中刪除。另一部分是,你需要在顯示圖像之前檢查它是否仍然存在,如果沒有,則延遲加載。

相關問題