前言:一直以來咩有時間整理viewController生命周期相關(guān)的問題,最近做了有時間做了細致的分析和整理览祖,隨筆記下羡玛,也參考了其他大大的文章,記錄下來九火,自己成長也可以記錄下對的東西,便于以后復(fù)習(xí)查看册招,民工路途漫漫岔激,以此和同學(xué)們共勉。
//非StroyBoard(xib或者非xib)都走這個方法
-(instancetype)initWithNibName:(NSSting*)nibNameOrNil bundle:(NSBundle*)nibBundleOrNil{
????if(self = [super initWithNibName:nibNameOrNilbundle:nibBundleOrNil]){
????}
return self;
}
//storyBoard 走這個方法
-(instancetype)initWithCoder:(NSCoder*)aDecoder{
? ? NSLog:(@"%s",_FUNCTION_)
? ? if( self = [super initWithCoder:aDecoder]){
????}
return self;
}
//xib加載完成
-(void)awakeFromNib{
[super awakeFromNib];
NSLog(@"%s",_FUNCTION_)
}
//加載視圖 (默認從nib)
-(void)loadView{
? ? self.view = [UIView alloc]initWithFrame:[UIScrenn mainScreen].bouns];
? ? self.view.backgroundColor = [UIColor greenColor];
}
//視圖控制器中的視圖加載完成是掰,viewController自帶的view加載完成
-(void)viewDidLoad{
????[super viewDidLoad];
}
//視圖將要出現(xiàn)
-(void)viewWillAppear:(BOOL)animated{
????[super viewWillAppear:aniamted];
}
//view即將布局其subViews
-(void)viewWillLayoutSubviews{
? ? [super viewWillLayoutSUbviews];
}
//view已經(jīng)布局其SubViews
-(void)viewDidLayoutSubViews{
? ? [super viewDidLayoutSubViews];
}
//?視圖已經(jīng)出現(xiàn)
-?(void)viewDidAppear:(BOOL)animated?{
????NSLog(@"%s",?__FUNCTION__);
????[superviewDidAppear:animated];
}
//?視圖將要消失
-?(void)viewWillDisappear:(BOOL)animated?{
????NSLog(@"%s",?__FUNCTION__);
????[superviewWillDisappear:animated];
}
//?視圖已經(jīng)消失
-?(void)viewDidDisappear:(BOOL)animated?{
????NSLog(@"%s",?__FUNCTION__);
????[superviewDidDisappear:animated];
}
//?出現(xiàn)內(nèi)存警告?
-?(void)didReceiveMemoryWarning?{
????NSLog(@"%s",?__FUNCTION__);
????[superdidReceiveMemoryWarning];
}
//?視圖被銷毀
-?(void)dealloc?{
????NSLog(@"%s",?__FUNCTION__);
}
分析
initWithNibName:bundle:
初始化UIViewController虑鼎,執(zhí)行關(guān)鍵數(shù)據(jù)初始化操作,非StoryBoard創(chuàng)建UIViewController都會調(diào)用這個方法键痛。
注意: 不要在這里做View相關(guān)操作炫彩,View在loadView方法中才初始化。
initWithCoder:
如果使用StoryBoard進行視圖管理絮短,程序不會直接初始化一個UIViewController江兢,StoryBoard會自動初始化或在segue被觸發(fā)時自動初始化,因此方法initWithNibName:bundle不會被調(diào)用戚丸,但是initWithCoder會被調(diào)用划址。
awakeFromNib
當(dāng)awakeFromNib方法被調(diào)用時,所有視圖的outlet和action已經(jīng)連接限府,但還沒有被確定夺颤,這個方法可以算作適合視圖控制器的實例化配合一起使用的,因為有些需要根據(jù)用戶喜好來進行設(shè)置的內(nèi)容胁勺,無法存在storyBoard或xib中世澜,所以可以在awakeFromNib方法中被加載進來。
loadView
當(dāng)執(zhí)行到loadView方法時署穗,如果視圖控制器是通過nib創(chuàng)建寥裂,那么視圖控制器已經(jīng)從nib文件中被解檔并創(chuàng)建好了,接下來任務(wù)就是對view進行初始化案疲。
loadView方法在UIViewController對象的view被訪問且為空的時候調(diào)用封恰。這是它與awakeFromNib方法的一個區(qū)別。
假設(shè)我們在處理內(nèi)存警告時釋放view屬性:self.view = nil褐啡。因此loadView方法在視圖控制器的生命周期內(nèi)可能被調(diào)用多次诺舔。
loadView方法不應(yīng)該直接被調(diào)用,而是由系統(tǒng)調(diào)用,它會加載或創(chuàng)建一個view并把它賦值給UIViewController的view屬性低飒。
在創(chuàng)建view的過程中许昨,首先會根據(jù)nibName去找對應(yīng)的nib文件然后加載。如果nibName為空或找不到對應(yīng)的nib文件褥赊,則會創(chuàng)建一個空視圖(這種情況一般是純代碼)
注意:在重寫loadView方法的時候糕档,不要調(diào)用父類的方法。
viewDidLoad
當(dāng)loadView將view載入內(nèi)存中拌喉,會進一步調(diào)用viewDidLoad方法來進行進一步設(shè)置速那。此時,視圖層次已經(jīng)放到內(nèi)存中司光,通常琅坡,我們對于各種初始化數(shù)據(jù)的載入悉患,初始設(shè)定残家、修改約束、移除視圖等很多操作都可以這個方法中實現(xiàn)售躁。
viewWillAppear
系統(tǒng)在載入所有的數(shù)據(jù)后坞淮,將會在屏幕上顯示視圖,這時會先調(diào)用這個方法陪捷,通常我們會在這個方法對即將顯示的視圖做進一步的設(shè)置回窘。比如,設(shè)置設(shè)備不同方向時該如何顯示市袖;設(shè)置狀態(tài)欄方向啡直、設(shè)置視圖顯示樣式等。
另一方面苍碟,當(dāng)APP有多個視圖時酒觅,上下級視圖切換是也會調(diào)用這個方法,如果在調(diào)入視圖時微峰,需要對數(shù)據(jù)做更新舷丹,就只能在這個方法內(nèi)實現(xiàn)。
viewWillLayoutSubviews
view即將布局其Subviews蜓肆。 比如view的bounds改變了(例如:狀態(tài)欄從不顯示到顯示,視圖方向變化)颜凯,要調(diào)整Subviews的位置,在調(diào)整之前要做的工作可以放在該方法中實現(xiàn)
viewDidLayoutSubviews
view已經(jīng)布局其Subviews仗扬,這里可以放置調(diào)整完成之后需要做的工作症概。
viewDidAppear
在view被添加到視圖層級中以及多視圖,上下級視圖切換時調(diào)用這個方法早芭,在這里可以對正在顯示的視圖做進一步的設(shè)置彼城。
viewWillDisappear
在視圖切換時,當(dāng)前視圖在即將被移除、或被覆蓋是精肃,會調(diào)用該方法秤涩,此時還沒有調(diào)用removeFromSuperview。
viewDidDisappear
view已經(jīng)消失或被覆蓋司抱,此時已經(jīng)調(diào)用removeFromSuperView;
dealloc
視圖被銷毀筐眷,此次需要對你在init和viewDidLoad中創(chuàng)建的對象進行釋放。
didReceiveMemoryWarning
在內(nèi)存足夠的情況下习柠,app的視圖通常會一直保存在內(nèi)存中匀谣,但是如果內(nèi)存不夠,一些沒有正在顯示的viewController就會收到內(nèi)存不足的警告资溃,然后就會釋放自己擁有的視圖武翎,以達到釋放內(nèi)存的目的。但是系統(tǒng)只會釋放內(nèi)存溶锭,并不會釋放對象的所有權(quán)宝恶,所以通常我們需要在這里將不需要顯示在內(nèi)存中保留的對象釋放它的所有權(quán),將其指針置nil趴捅。