1. 程式人生 > >UIViewController 中各方法呼叫順序及功能詳解

UIViewController 中各方法呼叫順序及功能詳解

UIViewController 中有很多關於載入和解除安裝的方法,如:loadView, viewDidLoad, viewWillAppear, viewDidAppear, viewWillLayoutSubviews,viewDidLayoutSubviews,viewWillDisappear, viewDidDisappear.

除錯日誌:
這裡寫圖片描述

載入過程

1. (instancetype)initWithNibName:bundle:

// 根據nib檔案例項化UIViewController
// 這個方法是在controller的類在IB中建立,但是通過Xcode例項化controller的時候用的.
-(instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil // 一般情況下呼叫 init 方法或者呼叫 initWithNibName 方法例項化UIViewController, 不管呼叫哪個方法都為呼叫initWithNibName. /* 如果是通過呼叫initWithNibName:bundle指定nib檔名初始化的話,ViewController會根據此nib來建立View。如果name引數為nil,則ViewController會通過以下兩個步驟找到與其關聯的nib: 1)如果ViewController的類名以“Controller”結尾,例如ViewController的類名是MyViewController,則查詢是否存在MyView.nib; 2)找跟ViewController類名一樣的檔案,例如MyViewController,則查詢是否存在MyViewController.nib */

2. -(void)loadView

當訪問 UIViewController 的 view 屬性時,view 如果此時是 nil,那麼 VC 會自動呼叫 loadView 方法來初始化一個 UIView 並賦值給 view 屬性。如果沒有過載 loadView 方法,則 UIViewController 會從 nib 或 StoryBoard 中查詢預設的 loadView ,預設的 loadView 會返回一個空白的 UIView 物件。

此方法在控制器的 view 為 nil 的時候被呼叫。 此方法用於以程式設計的方式建立 view 的時候用到。loadView 是使用程式碼生成檢視的時候,當檢視第一次載入的時候呼叫的方法。用於使用(寫)程式碼來實現控制元件。用於使用程式碼生成控制元件的函式。

注意點: 如果手工維護 views,必須過載重寫該方法;如果使用 IB 維護 views,必須不能過載重寫該方法。

3. -(void)viewDidLoad

如果 loadView 不能生成 UIViewController.view, 系統將會反覆呼叫 loadView 及 viewDidLoad 方法, 並且最終呼叫 [super loadView] 方法返回 UIViewController.view。

當VC的view物件載入記憶體後呼叫,用於對view進行額外的初始化操作 。

4. -(void)viewWillAppear:(BOOL)animated

檢視即將可見時呼叫(這個時候 supperView 還是 nil,即顯示動畫切換之前呼叫 )。預設情況下不執行任何操作。

這個方法中完成任何與檢視顯示相關的任務,例如改變檢視方向、狀態列方向、檢視顯示樣式等。

5. -(void)viewWillLayoutSubviews

view 即將佈局其 Subviews。比如 view 的 bounds 改變了(例如狀態列從不顯示到顯示,檢視方向變化),要調整 Subviews 的位置,在調整之前要做的一些工作就可以在該方法中實現。

6. -(void)viewDidLayoutSubviews

view 已經佈局其 Subviews。比如 view 的 bounds 改變了(例如狀態列從不顯示到顯示,檢視方向變化),已經調整 Subviews 的位置,在調整完成之後要做的一些工作就可以在該方法中實現。

7. -(void)viewDidAppear:(BOOL)animated

檢視已完全過渡到螢幕上時呼叫。在這個方法中執行檢視顯示相關附件任務,如果過載了這個方法,必須在方法中呼叫 [supper
viewDidAppear]。

解除安裝過程

8. -(void)viewWillDisappear:(BOOL)animated

view 即將從 superView 中移除且移除動畫切換之前,此時還沒有呼叫 removeFromSuperview。

9. -(void)viewDidDisappear:(BOOL)animated

view從superView中移除,移除動畫切換之後呼叫,此時已呼叫removeFromSuperview。

9. -(void)didReceiveMemoryWarning

當系統的記憶體不足時,該方法會被呼叫,我們可以在該方法裡釋放掉部分暫時不用的資源。

10. - (void)dealloc

viewController 最後的清理工作,釋放檢視物件的引用和 viewController 所需資料結構