前言:
做開發(fā)有一段時間了益老,基本想實現(xiàn)的功能都有辦法解決(谷歌百度...各種查)彪蓬,可是前段時間和一技術(shù)好友聊天來著,問了我一個問題捺萌,現(xiàn)在想想都尷尬档冬,“你知道UIViewController的生命周期嗎?”桃纯,我的回答“不就是有好多方法會根據(jù)控制器不同階段去調(diào)用這些方法”酷誓,他接住說“就這些?”态坦,我疑惑的問“不就是這些東西嗎盐数?難不成還有?”驮配,“前段時間我面試了技術(shù)娘扩,類似于你就這樣回答,我立馬做出pass他的準備”壮锻,“是嗎琐旁?”。后來細細回想起自己的答案猜绣,突然意識到白做開發(fā)這么多年了灰殴,只是掌握了快速開發(fā),也就意味著只了解開發(fā)的皮毛掰邢,而不知開發(fā)的骨頭長什么樣子牺陶,對于一個開發(fā)人員而言這個信號真的很危險,最直接1.面試;2.程序的優(yōu)化以及擴展辣之;掰伸,所以最近如果有時間就去剖析技術(shù)的深層理解,為了不讓自己如此low怀估。抒情的文字到此打住狮鸭,開始我們今天的正事。
流程圖:
- 生命周期包含的方法:
1 + (void)initialize;
2 - (instancetype)init;
3 - (void)loadView;
4 - (void)viewDidLoad;
5 -(void)viewWillLayoutSubviews;
6 -(void)viewDidLayoutSubviews;
7 - (void)viewWillAppear:(BOOL)animated;
8 - (void)viewDidAppear:(BOOL)animated
9 - (void)viewWillDisAppear:(BOOL)animated;
10 - (void)viewDidDisAppear:(BOOL)animated;
11 - (void)dealloc;
12 - (void)didReceiveMemoryWarning;
- 方法執(zhí)行順序:
測試方法:每個方法中進行方法名打印多搀,根據(jù)控制臺打印順序確定執(zhí)行順序歧蕉。
準備:兩個控制器A,B,在A控制器中點擊跳轉(zhuǎn)到B控制器康铭,跳轉(zhuǎn)是通過push方法惯退。
測試代碼:
+ (void)initialize
{
NSLog(@"initialize");
}
- (instancetype)init
{
if (self = [super init]) {
NSLog(@"init");
}
return self;
}
- (void)loadView
{
[super loadView];
NSLog(@"loadView");
}
- (void)viewDidLoad
{
[super viewDidLoad];
NSLog(@"viewDidLoad");
}
- (void)viewWillLayoutSubviews
{
[super viewWillLayoutSubviews];
NSLog(@"viewWillLayoutSubviews");
}
- (void)viewDidLayoutSubviews
{
[super viewDidLayoutSubviews];
NSLog(@"viewDidLayoutSubviews");
}
- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
NSLog(@"viewDidAppear");
}
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
NSLog(@"viewWillAppear");
}
- (void)viewDidDisappear:(BOOL)animated
{
[super viewDidDisappear:animated];
NSLog(@"viewDidDisappear");
}
- (void)viewWillDisappear:(BOOL)animated
{
[super viewWillDisappear:animated];
NSLog(@"viewWillDisappear");
}
- (void)dealloc
{
NSLog(@"dealloc");
}
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
NSLog(@"didReceiveMemoryWarning");
}
測試結(jié)果:
2016-06-27 13:28:24.075 ****循環(huán)輪播器****[2049:88990] initialize
2016-06-27 13:28:24.075 ****循環(huán)輪播器****[2049:88990] init
2016-06-27 13:28:24.116 ****循環(huán)輪播器****[2049:88990] loadView
2016-06-27 13:28:24.116 ****循環(huán)輪播器****[2049:88990] viewDidLoad
2016-06-27 13:28:24.116 ****循環(huán)輪播器****[2049:88990] viewWillAppear
2016-06-27 13:28:24.122 ****循環(huán)輪播器****[2049:88990] viewWillLayoutSubviews
2016-06-27 13:28:24.122 ****循環(huán)輪播器****[2049:88990] viewDidLayoutSubviews
2016-06-27 13:28:24.625 ****循環(huán)輪播器****[2049:88990] viewDidAppear
2016-06-27 13:28:31.260 ****循環(huán)輪播器****[2049:88990] viewWillDisappear
2016-06-27 13:28:31.762 ****循環(huán)輪播器****[2049:88990] viewDidDisappear
2016-06-27 13:28:31.763 ****循環(huán)輪播器****[2049:88990] dealloc
結(jié)論:測試結(jié)果已經(jīng)幫我們確定了每個方法的執(zhí)行順序,可能有細心的人已經(jīng)發(fā)現(xiàn)从藤,測試結(jié)果中少了一個方法的執(zhí)行催跪,- (void)didReceiveMemoryWarning锁蠕,原因很簡單,我們沒有觸發(fā)這個方法叠荠。
- 方法都干什么事:
+ (void)initialize; //類的初始化方法
- (instancetype)init; //對象初始化方法
-(void)loadView; //發(fā)信息調(diào)起加載視圖動作匿沛,視圖不顯示。
-(void)loadView; // 只有self.view = nil就會調(diào)用該方法榛鼎,如果控制器存在self.view被銷毀逃呼,系統(tǒng)會立刻調(diào)用loadView創(chuàng)建新的View。
- (void)viewDidLoad; //開始創(chuàng)建視圖對象者娱,視圖不顯示抡笼。
- (void)viewDidLoad // viewDidLoad主要做初始化使用,比如視圖中添加子視圖黄鳍,網(wǎng)絡(luò)數(shù)據(jù)加載等操作推姻。
-(void)viewWillAppear:(BOOL)animated; //視圖對象已經(jīng)創(chuàng)建就緒,視圖不顯示框沟。
-(void)viewWillLayoutSubviews; // 處理父視圖中的子視圖藏古。
-(void)viewDidLayoutSubviews; // 子視圖部署完成。
-(void)viewDidAppear:(BOOL)animated; //視圖開始顯示在屏幕忍燥。
-(void)viewWillDisappear:(BOOL)animated; // 視圖顯示的最后一刻拧晕。
-(void)viewDidDisappear:(BOOL)animated; //視圖完全消失。
-(void)dealloc; // 如果沒有強引用梅垄,視圖對象便會被銷毀厂捞。
- (void)didReceiveMemoryWarning; // 此刻該應用程序的內(nèi)存即將超過系統(tǒng)所給內(nèi)存最大值時,調(diào)用队丝。
總結(jié):
通過以上文字描述靡馁,我們知道了控制器生命周期中都執(zhí)行了那些方法,也知道他們的執(zhí)行順序机久,也了解了每個方法在不同階段執(zhí)行臭墨,可能會有遺漏,歡迎您的指正膘盖。讓開發(fā)變不在那么撲朔迷離不再那么的神秘裙犹,我可以多做一點,如果有興趣可以加群進行更多討論衔憨,群號:126440594。