所謂控制器的生命周期时肿,無(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.如果你要重寫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)行一些顯示前的處理,比如鍵盤彈出,一些特殊過(guò)程動(dòng)畫,比如狀態(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í)開發(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子控件添加約束**
程序第一次運(yùn)行,顯示第一個(gè)控制器的時(shí)候,按照如下順序執(zhí)行:
由第一個(gè)控制器右上角item按鈕跳到第二個(gè)控制器的時(shí)候,執(zhí)行打印:
由第二個(gè)控制器View中的button按鈕跳到第三個(gè)控制器的時(shí)候,執(zhí)行打印:
第二個(gè)控制器返回至第一個(gè)控制器的執(zhí)行打印:
第三個(gè)控制器返回至第二個(gè)控制器的執(zhí)行打印:
參考文獻(xiàn)
UIViewController的生命周期及iOS程序執(zhí)行順序
簡(jiǎn)書:學(xué)豆-控制器的生命周期