UIViewController的生命週期

丟的錢找到了發表於2019-04-19

一.生命週期的方法

  1. load (NSObject)
  2. initialize (NSObject)
  3. init (NSObject)
  4. initWithCoder
  5. initWithNibName
  6. awakeFromNib (NSObject)
  7. loadView
  8. viewDidLoad
  9. viewWillAppear
  10. updateViewConstraints
  11. viewWillLayoutSubviews
  12. viewDidLayoutSubviews
  13. viewDidAppear
  14. viewWillDisappear
  15. viewDidDisappear
  16. dealloc (NSObject)
  17. didReceiveMemoryWarning

二.load、initialize、init

  • 在main函式執行前,會初始化objc執行時環境,這時會載入所有類並呼叫類的load方法,常見的應用場景是在load方法中實現方法交換(Method Swizzle);
  • initialize方法會在類第一次收到訊息之前被呼叫,可以用來初始化靜態變數;
  • init方法屬於二段式構造中的概念,用來在類的記憶體被設定好後初始化成員變數.

三.initWithCoder、initWithNibName、awakeFromNib

3.1、initWithCoder、awakeFromNib

  • initWithCoder:反歸檔,如果物件是從檔案解析來的就會呼叫。
  • awakeFromNib:從xib或者storyboard載入完畢會呼叫。

新建UIView的子類並且想在load nib的時候做一些初始化工作的時候 可以重寫awakeFromNib。bundle在load nib後會給每個view物件傳送一個awakeFromNib訊息。

3.2、用storyboard或(Xib或者純程式碼)時的順序

3.2.1、用storyboard的順序:

initialize -> initWithCoder -> awakeFromNib -> loadView

3.2.2、用Xib或者純程式碼:

如果用init函式來初始化: initialize -> init -> initWithNibName -> loadView
如果用initWithNibName函式來初始化: initialize -> initWithNibName -> loadView

四、loadView

  1. self.view是在該函式中設定好的,載入成功後接著呼叫viewDidLoad函式.
  2. 每次呼叫控制器的view屬性時並且view為nil時,loadView函式就會被呼叫.
  3. 如果在loadView函式中自定義了view,那麼xib、storyboard中對頁面的設定會失效.
  4. 可以在viewDidLayoutSubviews函式中修改self.view的大小.
  5. [super loadView]預設的邏輯:如果控制器由xib或storyboard初始化,那麼會根據xib或storyboard的傳入的名字來初始化view;如果沒有顯示的指定名稱,就預設載入和控制器同名的檔案;如果沒有找到檔案,就會建立一個空白的UIView,這個view的frame為螢幕的大小.

五、viewDidLoad

在loadView執行完成後呼叫viewDidLoad主要完成介面的初始化

六、viewWillAppear

viewDidLoad執行完成後就執行viewWillAppear,每次進入頁面都會執行viewWillAppear

七、updateViewConstraints

在該函式中用於更新檢視的約束.在控制器的view更新檢視佈局時,會呼叫updateViewConstraints函式,可以重寫這個函式來更新當前檢視的佈局.這個函式只有在Autolayout佈局的時候才會被呼叫。初始化約束時,最好寫到init或viewDidLoad類似的函式中,updateViewConstraints適合於更新約束.

八、viewWillLayoutSubviews

在這個函式中佈局子檢視,如果用了Autolayout,那麼會在viewWillLayoutSubviews和viewDidLayoutSubviews之間用Autolayout機制佈局.

九、viewDidLayoutSubviews

控制器的子檢視的佈局已完成,這裡獲取的frame才是最正確的frame。如果用約束來佈局,在該函式去設定檢視的frame 是無效的。如果用frame來佈局的,在該函式中去設定檢視的frame是有效的。self.view在該函式中去設定frame是有效的。

十、viewWillDisappear

控制器的view即將消失的時候呼叫

十一、viewDidDisappear

控制器的view完全消失的時候呼叫

十二、 dealloc

解構函式,用於釋放自身持有的資源.

十三、didReceiveMemoryWarning

當系統記憶體不足時,當前控制器以及所在的導航棧上的控制器都會呼叫didReceiveMemoryWarning函式.該函式會判斷當前控制器的view是否顯示在window上,如果沒有會將view以及子view全部銷燬.

相關文章