ViewController的生命周期

前言:一直以來咩有時間整理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趴捅。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末垫毙,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子拱绑,更是在濱河造成了極大的恐慌综芥,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,525評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件猎拨,死亡現(xiàn)場離奇詭異膀藐,居然都是意外死亡,警方通過查閱死者的電腦和手機红省,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,203評論 3 395
  • 文/潘曉璐 我一進店門额各,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人类腮,你說我怎么就攤上這事臊泰。” “怎么了蚜枢?”我有些...
    開封第一講書人閱讀 164,862評論 0 354
  • 文/不壞的土叔 我叫張陵缸逃,是天一觀的道長。 經(jīng)常有香客問我厂抽,道長需频,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,728評論 1 294
  • 正文 為了忘掉前任筷凤,我火速辦了婚禮昭殉,結(jié)果婚禮上苞七,老公的妹妹穿的比我還像新娘。我一直安慰自己挪丢,他們只是感情好蹂风,可當(dāng)我...
    茶點故事閱讀 67,743評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著乾蓬,像睡著了一般惠啄。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上任内,一...
    開封第一講書人閱讀 51,590評論 1 305
  • 那天撵渡,我揣著相機與錄音,去河邊找鬼死嗦。 笑死趋距,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的越除。 我是一名探鬼主播节腐,決...
    沈念sama閱讀 40,330評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼廊敌!你這毒婦竟也來了铜跑?” 一聲冷哼從身側(cè)響起门怪,我...
    開封第一講書人閱讀 39,244評論 0 276
  • 序言:老撾萬榮一對情侶失蹤骡澈,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后掷空,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體肋殴,經(jīng)...
    沈念sama閱讀 45,693評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,885評論 3 336
  • 正文 我和宋清朗相戀三年坦弟,在試婚紗的時候發(fā)現(xiàn)自己被綠了护锤。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,001評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡酿傍,死狀恐怖烙懦,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情赤炒,我是刑警寧澤氯析,帶...
    沈念sama閱讀 35,723評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站莺褒,受9級特大地震影響掩缓,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜遵岩,卻給世界環(huán)境...
    茶點故事閱讀 41,343評論 3 330
  • 文/蒙蒙 一你辣、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦舍哄、人聲如沸宴凉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,919評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽跪解。三九已至,卻和暖如春签孔,著一層夾襖步出監(jiān)牢的瞬間叉讥,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,042評論 1 270
  • 我被黑心中介騙來泰國打工饥追, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留图仓,地道東北人。 一個月前我還...
    沈念sama閱讀 48,191評論 3 370
  • 正文 我出身青樓但绕,卻偏偏與公主長得像救崔,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子捏顺,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,955評論 2 355

推薦閱讀更多精彩內(nèi)容