UIViewController中view的生命週期


理解view的生命週期:

在UIViewController中,view(黑體的view指的是controller的view屬性)有兩個循環:加載和卸載循環。當程序的一部分向controller請求view的指針且view不在內存中時,view會進入加載循環,controller會將view加載入內存。

當程序接收到內存警告時,controller會嘗試卸載view,在卸載循環中,controller嘗試釋放它的view對象並返回到原始的無view狀態(當它不在屏幕上顯示時,這個條件的判斷到底是根據view的結構來還是根據用戶視覺來,我尚不清楚),直到view下次被請求。

在加載卸載循環中,controller處理的大部分邏輯。但是如果我們的controller還“持有”着view的後代view時,或者還有其他後續操作需要進行時,我們可以重載特定函數(後面會介紹到)來另行處理。

加載循環:

  1. 程序請求了controller的view.

  2. 如果view當前不在內存中,controller調用loadview函數。

  3. loadView 進行如下操作:

    • 如果你重載了這個函數,你應該自己創建必要的views並且將一個非nil值賦給view屬性

    • 如果你沒有重載這個函數,默認實現會使用controller的nibName 和 nibBundle屬性來嘗試從nib文件加載view。如果沒有找到nib文件,它嘗試尋找一個與view controller類名匹配(viewControllerClassName.nib)的nib文件。

    • 如果沒有可用的nib文件,那麼它創建一個空的UIView作爲它的view

  4.  controller 調用  viewDidLoad 方法來執行一些加載時(加載時一詞,相對於編譯時、運行時)任務.

程序可以重載loadView 和 viewDidLoad來執行一些任務:

卸載循環:

  1. 程序收到內存警告.

  2. 每個view controller調用 didReceiveMemoryWarning:

    • If you override this method, you should use it to release any custom data that your view controller object no longer needs. You should not use it to release your view controller’s view. You must call super at some point in your implementation to perform the default behavior.(iOS3.0以後不建議重載這個函數來進行額外的清除操作,使用viewDidUnload)

    • 默認實現會在確定可以安全地釋放view時釋放掉view

  3. 如果controller釋放了它的view, 它會調用 viewDidUnload. .可以重載這個函數來進行額外的清理操作(不要清除view和那些加載循環中無法rebuild的數據)。


原文地址:http://www.cnblogs.com/Piosa/archive/2012/02/22/2363258.html


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章