所謂控制器的生命周期,無非就是幾個方法的調(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