2012年8月10日 星期五

UIViewController的生命週期 - Part1



資料來源:http://w11h22j33.iteye.com/blog/1565210

         UIViewControl是IOS程式中的一個重要組成部分,扮演者一個大管家的身份,管理著程式中的眾多視圖,今天看看了官方文檔並做了如下一些簡單的記錄:

        何時載入view,載入的原則是什麼,視圖何時消失等問題,文檔中講的都很詳細。Controller的view最好在需要顯示時再去載入,並且在系統發出記憶體警告時釋放比必要的view及相關的資料物件。

一、UIViewController的初始化

  初始化時會根據需要調用init,initWithCoder等相關函數,這個時候我們可以做一下簡單的初始化操作,建立ViewController中需要使用的資料模型等,不建議在初始化階段就直接創建view及其他與顯示有關的物件(應該放到loadView的時候去創建,或者採用懶載入的方法創建)。
  我們都知道ViewController可以通過代碼和xib兩種方式創建,這兩種方式的初始化流程也不盡相同。

  1)使用xib創建的VC

  xib其實最終是會把我們的設置保存成一個資料集,當需要初始化構建VC的時候,回去讀取記錄的資料集,然後幫我們動態的創建VC,因此可以想像它在初始化時會先去找看是否實現initWithCoder方法,如果該類實現了該方法,就直接調用initWithCoder方法創建物件,如果沒有實現的話就調用init方法。調用完初始化方法以後緊接著會調用awakeFromNib方法,在這個方法裡面我們可以做進一步的初始化操作。

  2)使用代碼創建VC

  使用代碼創建時,我們根據需要手動的創建VC中的資料,如果自己定制VC時,還需要在init中調用[super init]。

二、UIViewController中View的load和unload

  前面講了不建議在VC初始化的時候就創建view及其他與顯示相關的代碼,官方文檔建議將View的初始化操作放到loadView的時候再做,當VC接到記憶體告警時會調用didRecieveMemoryWarning這個時候我們就要做出回應,釋放暫時不需要的物件。如果無視這個警告,系統記憶體不夠用時會會繼續發送,如果還得不到處理就會強制退出程式。下面看具體的loadView和unloadView時候都會做什麼操作。

  1)Load週期


  當需要顯示或者訪問view屬性時,view沒有創建的話,VC就會調用loadView方法,在這個時候會創建一個view並將其賦給VC.view屬性。緊接著就會調用VC的viewDidLoad方法,這個時候VC.view保證是有值的,可以做進一步的初始化操作,例如添加一些subview。注意:定制VC時,如果覆蓋loadView方法,不需要調用[super loadView]方法。

  2)Unload週期



  當app收到記憶體警告的時候,會調用每一個VC的didRecieveMemoryWarning方法,我們需要做出回應,釋放程式中暫時不需要的資源。通常都會重寫該方法,重寫時候需要調用super的該方法。如果檢測到當前VC的view可以被安全釋放的話,就會調用viewWillUnload方法,這個我們必須要重視,因為當VC的view消失時候它的subviews可能會被一起釋放,我們需要根據具體情況做一些記錄,以保證下次能夠正確創建,同時不出現記憶體洩漏。調用viewWillUnload以後,會將VC.view屬性設置成nil,然後在調用viewDidUnload方法,這個時候我們可以釋放那些強引用的物件。

官方文檔:The View Controller Life Cycle

沒有留言:

張貼留言