iOS 控制器ViewController的生命周期,以及各個方法調(diào)用的順序

所謂控制器的生命周期,無非就是幾個方法的調(diào)用順序(如下方法按照順序執(zhí)行):

  • 加載根視圖
/* 加載根視圖 */
- (void)loadView {
    [super loadView];
    //控制器的根視圖View是懶加載的;
    //加載View,創(chuàng)建View,優(yōu)先級最高;
    //從nib載入視圖,通常這一步不需要去干涉。除非你沒有使用xib文件創(chuàng)建視圖。(在定制 VC 時,如果覆蓋loadView方法,不需要調(diào)用[super loadView] 方法
    //1.如果你要重寫loadView,可以自定義一個與系統(tǒng)不一樣的View
    //2.可以在根視圖中添加一些一些子視圖
    NSLog(@"%s",__FUNCTION__);

}
  • 控制器加載完畢的時候
- (void)viewDidLoad {
    [super viewDidLoad];
    
    //1.可以為控制器自定義數(shù)據(jù),數(shù)據(jù)加載
    //2.動態(tài)創(chuàng)建其他控件(同名南昌會在這里做各種初始數(shù)據(jù)的載入,初始設定等很多內(nèi)容)
    NSLog(@"%s",__FUNCTION__);
}
  • 控制器的View即將顯示
- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    //進行一些顯示前的處理,比如鍵盤彈出,一些特殊過程動畫,比如狀態(tài)欄和* navigationbar*的顏色等
    //不會調(diào)整初始狀態(tài)的界面布局;
    //在視圖要展示出來之前,做些準備操作,約束還沒生效;
     NSLog(@"%s",__FUNCTION__);
}

在- (void)viewWillAppear:(BOOL)animated 與 - (void)viewDidAppear:(BOOL)animated 之間還要執(zhí)行兩個關鍵的方法:

  • 根視圖即將布局子視圖
/* 根視圖即將布局子視圖 */
- (void)viewWillLayoutSubviews {
    [super viewWillLayoutSubviews];
      //Subviews的布局調(diào)整完畢之前要做的一些事情;
    /* 在根視圖或者它的子視圖的frame值發(fā)生改變 */
    /* 或者當前屏幕的狀態(tài)發(fā)生改變時調(diào)用 */
    NSLog(@"%s",__FUNCTION__);
}
  • 根視圖已經(jīng)完成子視圖的布局
/* 根視圖已經(jīng)完成子視圖的布局 */
- (void)viewDidLayoutSubviews {
    [super viewDidLayoutSubviews];
    //Subviews的布局調(diào)整完畢之后要做的一些事情;
      /* 比如,一旦imageView的frame值改變,切圓角的操作就放在這里進行 */
    NSLog(@"%s",__FUNCTION__);
    
}
  • 控制器的View已經(jīng)顯示
/* 控制器的View已經(jīng)顯示 */
- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    
    //視圖展示出來之后,約束已經(jīng)生效;
    NSLog(@"%s",__FUNCTION__);
    
}
  • 控制器的View即將消失
/* 控制器的View即將消失*/
- (void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];
    //視圖即將從屏幕移除之前執(zhí)行,此時還沒有調(diào)用`removeFromSuperview`,視圖即將被移除,覆蓋時會在這里做一些善后處理和設置
     NSLog(@"%s",__FUNCTION__);
    
}
  • 控制器的View已經(jīng)消失
/* 控制器的View已經(jīng)消失*/
- (void)viewDidDisappear:(BOOL)animated {
    [super viewDidDisappear:animated];
    //視圖已經(jīng)從屏幕上移除了,用戶看不到這個視圖了。此時已調(diào)用removeFromSuperview。
    //釋放一些不再需要的資源,與UI顯示有關的資源
    NSLog(@"%s",__FUNCTION__);
    
}

  • 接收到內(nèi)存警告
/* 接收到內(nèi)存警告 */
- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    NSLog(@"%s",__FUNCTION__);
}

過時的方法 iOS6.0 之前

  • 即將銷毀View
/* 即將銷毀View */
- (void)viewWillUnload {
    // 發(fā)生內(nèi)存警告時,在對其他視圖銷毀前調(diào)用。
    //銷毀View
    NSLog(@"%s",__FUNCTION__);
}
  • 已經(jīng)銷毀View
/* 已經(jīng)銷毀View */
- (void)viewDidUnload {
    //發(fā)生內(nèi)存警告時,如果視圖不是當前屏幕正在顯示的視圖,viewDidUnload將會被執(zhí)行,本視圖所有子視圖將被銷毀以釋放內(nèi)存,此時開發(fā)者需要手動對viewLoad、viewDidLoad中創(chuàng)建的對象釋放內(nèi)存。因為當這個視圖再次顯示在屏幕上的時候viewLoad、viewDidLoad會再次被調(diào)用。
    //銷毀一些不必要的屬性 和數(shù)據(jù)
    NSLog(@"%s",__FUNCTION__);
}

** 給各個控制器view子控件添加約束**


圖一.png

程序第一次運行,顯示第一個控制器的時候,按照如下順序執(zhí)行:


輸出臺1.png

由第一個控制器右上角item按鈕跳到第二個控制器的時候,執(zhí)行打印:


輸出臺2.png

由第二個控制器View中的button按鈕跳到第三個控制器的時候,執(zhí)行打印:


輸出臺3.png

第二個控制器返回至第一個控制器的執(zhí)行打印:


輸出臺4.png

第三個控制器返回至第二個控制器的執(zhí)行打印:


輸出臺5.png

源碼鏈接

參考文獻

UIViewController的生命周期及iOS程序執(zhí)行順序
簡書:學豆-控制器的生命周期

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容