viewController的生命周期

生命周期

?我們建立一個(gè)簡(jiǎn)單的模型來測(cè)試生命周期停士,新建兩個(gè)viewController,一個(gè)是主視圖控制器(mainViewController,以下簡(jiǎn)稱mainVC),一個(gè)是副視圖控制器(sub ViewController ,以下簡(jiǎn)稱subVC),在mainVC里點(diǎn)擊一個(gè)button,以modal方式切換至subVC,然后在subVC里點(diǎn)擊另一個(gè)button關(guān)閉subVC涉茧。我們將這兩個(gè)控制器的每個(gè)狀態(tài)都打印出來每界,各個(gè)階段的執(zhí)行如下:

case1.第一次運(yùn)行app:

main loadView

main viewDidLoad

main viewWillAppear

main viewDidAppear


case 2.在mainVC里點(diǎn)擊Button候引,以modal方式切換至subVC:

sub loadView

sub viewDidLoad

main viewWillDisappear

sub viewWillAppear

sub viewDidAppear

main viewDidDisappear


case 3.在subVC里點(diǎn)擊button關(guān)閉subVC并返回mainVC:

sub viewWillDisappear

main viewWillAppear

main viewDidAppear

sub viewDidDisappear

sub dealloc


當(dāng)一個(gè)視圖控制器被創(chuàng)建渊迁,并在屏幕上顯示的時(shí)候代碼的執(zhí)行順序:

step1 ?alloc對(duì)象季研,分配空間

step2飞主,init (initWithNibName)初始化對(duì)象

step3,loadView 從nib載入視圖前鹅,通常這一步不需要去干涉摘悴,除非你沒用使用xib文件創(chuàng)建視圖

step4,viewDidLoad載入完成舰绘,可以進(jìn)行自定義數(shù)據(jù)以及動(dòng)態(tài)創(chuàng)建其他控件

step5蹂喻,viewWillAppear視圖將出現(xiàn)在屏幕之前葱椭,馬上這個(gè)視圖就會(huì)被展現(xiàn)在屏幕上了

step6,viewDidAppear視圖已經(jīng)在屏幕上渲染完成

當(dāng)一個(gè)視圖控制器被移除屏幕并且銷毀的時(shí)候的執(zhí)行順序:

step1 ?viewWillDisappear視圖將從屏幕上移除之前執(zhí)行

step2 ? viewDidDisappear視圖已經(jīng)被從屏幕上移除口四,用戶看不到這個(gè)視圖了

step3 ?dealloc視圖被銷毀

?loadView和viewDidLoad的區(qū)別:當(dāng)loadView時(shí)孵运,還沒有view,而viewDidLoad時(shí)窃祝,view已經(jīng)創(chuàng)建好了掐松。詳細(xì)的加載循環(huán):

step1 ?程序請(qǐng)求viewController的view屬性

step2 ?如果view在內(nèi)存中,則直接加載粪小,如果不存在,則調(diào)用loadView方法

step3 ?loadView方法執(zhí)行如下方法:

* ? 如果重載了這個(gè)方法抡句,則必須創(chuàng)建必要的UIView并且將一個(gè)非nil值傳給ViewController的view屬性

* ? 如果沒用重載這個(gè)方法探膊,viewController會(huì)默認(rèn)使用自己的nibName和nibBundle屬性嘗試從nib文件加載view。如果沒用找到nib文件待榔,它嘗試尋找一個(gè)與viewController類名匹配的nib文件

* ? 如果沒有可用的nib文件逞壁,那么它創(chuàng)建一個(gè)空的UIView作為它的view

最后還要考慮一個(gè)重要的情況:內(nèi)存不足警告。當(dāng)程序員收到內(nèi)存警告的時(shí)候锐锣,會(huì)調(diào)用每一個(gè)ViewController的didReceiveMemoryWarning方法腌闯,我們需要作出響應(yīng),釋放程序中暫時(shí)不需要的資源雕憔,通常都會(huì)重寫該方法姿骏,但記得重寫的時(shí)候要調(diào)用super的該方法。

iOS 3.0-iOS6.0 期間斤彼,didReceiveMemoryWarning方法會(huì)判斷當(dāng)前viewController的viewDidUnload方法分瘦。但是iOS6.0開始,ViewDidUnload和viewWillUnload這兩個(gè)方法已被廢除琉苇,收到lowmemory時(shí)系統(tǒng)不會(huì)釋放view嘲玫,而只是釋放controller的resource。

一種常見處理內(nèi)存警告的方式:

- (void)didReceiveMemoryWarning

{

[super didReceiveMemoryWarning];

float ver = [[UIDevice currentDevice] systemVersin] floatValue];

if(ver >= 6.0f)

{

if(self.isViewLoaded && !self.view.window)

{

self.view = nil; // 確保下次重新加載

}

}

}

上面的代碼先取得當(dāng)前iOS系統(tǒng)的版本號(hào)并扇,如果是iOS6.0或以上版本去团,進(jìn)一步判斷視圖是否會(huì)被裝載進(jìn)內(nèi)存,并且是否為當(dāng)前視圖穷蛹,在這兩個(gè)條件都滿足(已經(jīng)裝載進(jìn)內(nèi)存&&不是當(dāng)前視圖)時(shí)土陪,將self.view設(shè)置為nil,這樣就能保證再調(diào)用該viewController時(shí)俩莽,loadView和viewDidLoad被再次調(diào)用旺坠。

我們?cè)趚code調(diào)試器里模擬內(nèi)存警告,監(jiān)控此時(shí)切換的狀態(tài):

case 4扮超, 當(dāng)已切換至subVC取刃,模擬內(nèi)存警告蹋肮,并返回mainVC,不處理didReceiveMomeoryWarning

Received memory warning.

main didReceiveMemoryWarning

sub ? viewWillDisappear

main ?viewWillAppear

main viewDidAppear

sub viewDidDisappear

sub dealloc

case 5.當(dāng)切換至subVC璧疗,模擬內(nèi)存警告坯辩,并返回mainVC,處理didReceiveMemoryWarning崩侠。

main ?didReceiveMemoryWarning

sub didReceiveMemoryWarning

main loadView

main viewDidLoad

sub ?viewWillDisappear

main viewWillAppear

main viewDidAppear

sub viewDidDisappear

sub dealloc

可以看出漆魔,當(dāng)處理了didReceivememoryWarning后,重新執(zhí)行了非當(dāng)前視圖的loadView和viewDidLoad方法却音。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末改抡,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子系瓢,更是在濱河造成了極大的恐慌阿纤,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,402評(píng)論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件夷陋,死亡現(xiàn)場(chǎng)離奇詭異欠拾,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)骗绕,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門藐窄,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人酬土,你說我怎么就攤上這事荆忍。” “怎么了诺凡?”我有些...
    開封第一講書人閱讀 162,483評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵东揣,是天一觀的道長。 經(jīng)常有香客問我腹泌,道長嘶卧,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,165評(píng)論 1 292
  • 正文 為了忘掉前任凉袱,我火速辦了婚禮芥吟,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘专甩。我一直安慰自己钟鸵,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,176評(píng)論 6 388
  • 文/花漫 我一把揭開白布涤躲。 她就那樣靜靜地躺著棺耍,像睡著了一般。 火紅的嫁衣襯著肌膚如雪种樱。 梳的紋絲不亂的頭發(fā)上蒙袍,一...
    開封第一講書人閱讀 51,146評(píng)論 1 297
  • 那天俊卤,我揣著相機(jī)與錄音,去河邊找鬼害幅。 笑死消恍,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的以现。 我是一名探鬼主播狠怨,決...
    沈念sama閱讀 40,032評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼邑遏!你這毒婦竟也來了佣赖?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,896評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤记盒,失蹤者是張志新(化名)和其女友劉穎茵汰,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體孽鸡,經(jīng)...
    沈念sama閱讀 45,311評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,536評(píng)論 2 332
  • 正文 我和宋清朗相戀三年栏豺,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了彬碱。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,696評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡奥洼,死狀恐怖巷疼,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情灵奖,我是刑警寧澤嚼沿,帶...
    沈念sama閱讀 35,413評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站瓷患,受9級(jí)特大地震影響骡尽,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜擅编,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,008評(píng)論 3 325
  • 文/蒙蒙 一攀细、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧爱态,春花似錦谭贪、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至洞渔,卻和暖如春套媚,著一層夾襖步出監(jiān)牢的瞬間缚态,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評(píng)論 1 269
  • 我被黑心中介騙來泰國打工凑阶, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留猿规,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,698評(píng)論 2 368
  • 正文 我出身青樓宙橱,卻偏偏與公主長得像姨俩,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子师郑,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,592評(píng)論 2 353

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