一 ,視圖控制器生命周期指的是:控制器 ?被加載(viewDidLoad)--->視圖即將現(xiàn)實(shí)(viewWillAppear)--->視圖已經(jīng)顯示(viewDidAppear)--->視圖即將消失(viewWillDisappear)--->視圖已經(jīng)消失(viewDidDisappear) 這樣一個(gè)過程。
二炼蛤,視圖控制器在完成它整個(gè)生命周期的同時(shí)冒窍,系統(tǒng)也在調(diào)用相應(yīng)的函數(shù),控制生命周期的函數(shù)有以下幾個(gè):
1,- (void)viewDidLoad; ?( 視圖第一次被加載的時(shí)候調(diào)用甘磨,整個(gè)程序運(yùn)行過程中這個(gè)函數(shù)只會(huì)被調(diào)用一次逞泄,因此經(jīng)常會(huì)在這個(gè)函數(shù)里做一些初始化相關(guān)的工作 ) 患整;
2,- (void)viewWillAppear:(BOOL)animated; ?(控制器即將顯示的時(shí)候調(diào)用炭懊,默認(rèn)情況什么也不做并级,程序運(yùn)行過程中可能被調(diào)用多次 ); ?
3,- (void)viewDidAppear:(BOOL)animated;? ? ( 控制器已經(jīng)顯示的時(shí)候調(diào)用侮腹,默認(rèn)情況什么也不做嘲碧,程序運(yùn)行過程中可能被調(diào)用多次 );
4父阻,- (void)viewWillDisappear:(BOOL)animated;? ( 控制器即將消失的時(shí)候調(diào)用愈涩,默認(rèn)情況什么也不做,程序運(yùn)行過程中可能被調(diào)用多次 );
5加矛,- (void)viewDidDisappear:(BOOL)animated;? ( 控制器已經(jīng)消失的時(shí)候調(diào)用履婉,默認(rèn)情況什么也不做,程序運(yùn)行過程中可能被調(diào)用多次 )斟览;
三毁腿,為了驗(yàn)證上面的說法,我們創(chuàng)建一個(gè)工程來測試一下:
1苛茂,創(chuàng)建一個(gè)工程已烤,在ViewController里面實(shí)現(xiàn)視圖控制器生命周期的函數(shù),當(dāng)調(diào)用到相關(guān)的函數(shù)是輸出相關(guān)的日志妓羊;
// 視圖控制器第一次被加載的時(shí)候調(diào)用
- (void)viewDidLoad {
[super viewDidLoad];
self.view.backgroundColor = [UIColor redColor];
NSLog(@"視圖控制器A被加載了");
}
// 視圖控制器即將顯示的時(shí)候調(diào)用(還沒顯示)
- (void)viewWillAppear:(BOOL)animated{
NSLog(@"視圖控制器A即將顯示");
}
// 視圖控制器已經(jīng)顯示的時(shí)候調(diào)用
- (void)viewDidAppear:(BOOL)animated{
NSLog(@"視圖控制器A已經(jīng)顯示");
}
// 視圖控制器即將消失的時(shí)候調(diào)用(還沒消失)
- (void)viewWillDisappear:(BOOL)animated{
NSLog(@"視圖控制器A即將消失");
}
- (void)viewDidDisappear:(BOOL)animated{
NSLog(@"視圖控制器A已經(jīng)消失");
}
運(yùn)行以后控制臺(tái)輸出的結(jié)果如下:
2016-08-06 23:13:57.779 UIViewController-LifeCycle[2830:449138] 視圖控制器A被加載了
2016-08-06 23:13:57.779 UIViewController-LifeCycle[2830:449138] 視圖控制器A即將顯示
2016-08-06 23:13:57.784 UIViewController-LifeCycle[2830:449138] 視圖控制器A已經(jīng)顯示
2胯究,看到整個(gè)控制器的生命周期,我們自定義一個(gè)視圖控制器來做輔助躁绸,創(chuàng)建BViewController , 并在ViewController里面重寫touchBegan方法裕循,在touchBegan方法里面實(shí)現(xiàn)切換到BViewController控制器的目的臣嚣,代碼如下:
// 點(diǎn)擊屏幕是切換到B控制器
- (void)touchesBegan:(NSSet*)touches withEvent:(UIEvent *)event{
BViewController *bVc = [[BViewController alloc] init];
bVc.view.frame = [UIScreen mainScreen].bounds;
bVc.view.backgroundColor = [UIColor blueColor];
[self presentViewController:bVc animated:YES completion:nil];
}
3,在BViewController控制器里面業(yè)重寫touchBegan方法剥哑,當(dāng)點(diǎn)擊B的屏幕是返回到A(VeiwController)控制器硅则,代碼如下:
// 點(diǎn)擊B屏幕還退回到A
- (void)touchesBegan:(NSSet*)touches withEvent:(UIEvent *)event{
[self dismissViewControllerAnimated:YES completion:nil];
}
4,當(dāng)我們由A切換到B是株婴,控制臺(tái)→多輸出了兩行內(nèi)容:
2016-08-06 23:46:38.065 UIViewController-LifeCycle[2830:449138] 視圖控制器A即將消失
2016-08-06 23:46:38.575 UIViewController-LifeCycle[2830:449138] 視圖控制器A已經(jīng)消失
我們可以看到抢埋,當(dāng)A控制器消失以后,A控制器的整個(gè)生命周期就走完了督暂,所有響應(yīng)的函數(shù)都有被調(diào)用揪垄。 ?
5,為了證明viewDidLoad函數(shù)只會(huì)被調(diào)用一次逻翁,而其他的函數(shù)回被調(diào)用多次饥努,我們點(diǎn)擊B控制器的屏幕,返回到A控制器八回,當(dāng)返回到A以后在點(diǎn)擊A的屏幕切換到B酷愧,這個(gè)時(shí)候控制臺(tái)輸出了以下四行內(nèi)容:
2016-08-06 23:52:18.959 UIViewController-LifeCycle[2830:449138] 視圖控制器A即將顯示
2016-08-06 23:52:19.462 UIViewController-LifeCycle[2830:449138] 視圖控制器A已經(jīng)顯示
2016-08-06 23:52:24.381 UIViewController-LifeCycle[2830:449138] 視圖控制器A即將消失
2016-08-06 23:52:24.884 UIViewController-LifeCycle[2830:449138] 視圖控制器A已經(jīng)消失
可以發(fā)現(xiàn),系統(tǒng)這次沒有調(diào)用viewDidLoad函數(shù)缠诅,其他的都有調(diào)用溶浴;反復(fù)這樣做幾次結(jié)果都是一樣,所以可以印證開始的說法管引,viewDidLoad函數(shù)在整個(gè)程序運(yùn)行過程中只會(huì)被調(diào)用一次士败,其他接個(gè)函數(shù)可能會(huì)被調(diào)用多次。