一.生命週期的方法
- load (NSObject)
- initialize (NSObject)
- init (NSObject)
- initWithCoder
- initWithNibName
- awakeFromNib (NSObject)
- loadView
- viewDidLoad
- viewWillAppear
- updateViewConstraints
- viewWillLayoutSubviews
- viewDidLayoutSubviews
- viewDidAppear
- viewWillDisappear
- viewDidDisappear
- dealloc (NSObject)
- 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
- self.view是在該函式中設定好的,載入成功後接著呼叫viewDidLoad函式.
- 每次呼叫控制器的view屬性時並且view為nil時,loadView函式就會被呼叫.
- 如果在loadView函式中自定義了view,那麼xib、storyboard中對頁面的設定會失效.
- 可以在viewDidLayoutSubviews函式中修改self.view的大小.
- [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全部銷燬.