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

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

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

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

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

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

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

過(guò)時(shí)的方法 iOS6.0 之前

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

** 給各個(gè)控制器view子控件添加約束**


圖一.png

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


輸出臺(tái)1.png

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


輸出臺(tái)2.png

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


輸出臺(tái)3.png

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


輸出臺(tái)4.png

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


輸出臺(tái)5.png

源碼鏈接

參考文獻(xiàn)

UIViewController的生命周期及iOS程序執(zhí)行順序
簡(jiǎn)書(shū):學(xué)豆-控制器的生命周期

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

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

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