UIViewController中View的生命周期

一瓷蛙、 大體流程:

(loadView/nib)文件來(lái)加view到內(nèi)存-->viewDidLoad函數(shù)進(jìn)一步初始化這些view-->內(nèi)存不足時(shí)厌衙, 調(diào)用viewDidUnload函數(shù)釋放views-->當(dāng)需要使用view時(shí)又回到第一步。

  • loadView:
    永遠(yuǎn)不要主導(dǎo)調(diào)用這個(gè)函數(shù)勉盅。
    viewController 會(huì)在view的property被請(qǐng)求并且當(dāng)前view值為nil時(shí)調(diào)用這個(gè)函數(shù)。如果你手動(dòng)創(chuàng)建view丢习, 你應(yīng)該重載這個(gè)函數(shù),切不要在重載的時(shí)候調(diào)用[super loadView]淮悼。

  • viewDidLoad:
    這個(gè)函數(shù)的作用主要是讓你可以進(jìn)一步的初始化你的views咐低。
    viewDidLoad通常負(fù)責(zé)的是view及其子view被加載進(jìn)內(nèi)存之后的數(shù)據(jù)初始化的工作,即視圖的數(shù)據(jù)部分的初始化袜腥。

  • viewDidUnLoad:
    這個(gè)函數(shù)時(shí)viewDidLoad的對(duì)立函數(shù)见擦。在程序內(nèi)存欠缺時(shí),這個(gè)函數(shù)被controller調(diào)用羹令,來(lái)釋放他的view以及view相關(guān)的對(duì)象鲤屡。由于controller通常保存著view以及相關(guān)的object的引用,所以你必須使用這個(gè)函數(shù)來(lái)放棄這些對(duì)象的所有權(quán)以便內(nèi)存回收福侈,但不要釋放那些難以重建的數(shù)據(jù)酒来。

  • viewWillAppear:
    視圖即將可見(jiàn)時(shí)調(diào)用,默認(rèn)情況下不執(zhí)行任何操作肪凛。

  • viewDidAppear:
    視圖已完全過(guò)渡到屏幕上時(shí)調(diào)用堰汉。

  • viewWillDisappear:
    視圖被駁回時(shí)調(diào)用,覆蓋或以其他方式隱藏伟墙,默認(rèn)情況下不執(zhí)行任何操作翘鸭。

  • viewDidDisappear:
    視圖被駁回后調(diào)用,覆蓋或以其他方式隱藏远荠。默認(rèn)情況下不執(zhí)行任何操作矮固。

  • didReceiveMemoryWarning:
    當(dāng)程序內(nèi)存過(guò)度時(shí),系統(tǒng)會(huì)調(diào)用該方法譬淳。

二档址、Controller和View的生命周期

這里指的View是指Controller的View。它作為Controler的屬性邻梆,生命周期在Controller的生命周期內(nèi)守伸。就是說(shuō)你的Controller不能在view釋放前就釋放了。
當(dāng)你alloc并iit了一個(gè)ViewController時(shí)浦妄,這個(gè)ViewController應(yīng)該是還沒(méi)有創(chuàng)建view的尼摹。ViewController的view是使用了lazyInit方式創(chuàng)建,就是說(shuō)你調(diào)用的view屬性的getter:[self view]剂娄。在getter里會(huì)先判斷view是否創(chuàng)建蠢涝,如果沒(méi)有創(chuàng)建,那么會(huì)調(diào)用loadView來(lái)創(chuàng)建view阅懦。loadView完成時(shí)會(huì)繼續(xù)調(diào)用viewDidLoad和二。loadView和viewDidLoad的一個(gè)區(qū)別就是:loadView時(shí)還沒(méi)有view。而viewDidLoad時(shí)view以及創(chuàng)建好了耳胎。
當(dāng)view被添加其他view中之前時(shí)惯吕,會(huì)調(diào)用viewWillAppear惕它,而之后會(huì)調(diào)用viewDidAppear。
當(dāng)view從其他view中移出之前時(shí)废登,會(huì)調(diào)用viewWillDisAppear淹魄,而之后會(huì)調(diào)用viewDidDisappear。
當(dāng)view不在使用堡距,而且是disappeared甲锡,受到內(nèi)存警告時(shí),那么viewController會(huì)將view釋放并將其指向nil吏颖。

三搔体、代碼組織(如何設(shè)計(jì)良好的ViewController)

ViewController生命周期中有那么多函數(shù),一個(gè)重要問(wèn)題就是什么代碼該寫在什么地方半醉。

  1. init里不要出現(xiàn)創(chuàng)建view的代碼疚俱。良好的設(shè)計(jì),在init里應(yīng)該只有相關(guān)數(shù)據(jù)的初始化缩多,而且這些數(shù)據(jù)都是比較關(guān)鍵的數(shù)據(jù)呆奕。init里不要掉self.view,否則會(huì)導(dǎo)致viewcontroller創(chuàng)建view衬吆。(因?yàn)関iew是lazyinit的)梁钾。
  2. loadView中只初始化view,一般用于創(chuàng)建比較關(guān)鍵的view如tableViewController的tabView逊抡,UINavigationController的navgationBar姆泻,不可掉用view的getter(在掉super loadView前),最好也不要初始化一些非關(guān)鍵的view冒嫡。如果你是從nib文件中創(chuàng)建的viewController在這里一定要首先調(diào)用super的loadView方法拇勃,但建議不要重載這個(gè)方法。
  3. viewDidLoad 這時(shí)候view已經(jīng)有了孝凌,最適合創(chuàng)建一些附加的view和控件了方咆。
  4. viewWillAppear 這個(gè)一般在view被添加到superview之前,切換動(dòng)畫之前調(diào)用蟀架。在這里可以進(jìn)行一些顯示前的處理瓣赂。比如鍵盤彈出,一些特殊的過(guò)程動(dòng)畫(比如狀態(tài)條和navigationbar顏色)片拍。
  5. viewDidAppear 一般用于顯示后煌集,在切換動(dòng)畫后,如果有需要的操作捌省,可以在這里加入相關(guān)代碼苫纤。
  6. viewDidUnload 這時(shí)候viewController的view已經(jīng)是nil了。由于這一般發(fā)生在內(nèi)存警告時(shí),所以在這里你應(yīng)該將那些不在顯示的view釋放了方面。比如你在viewcontroller的view上加了一個(gè)label,而且這個(gè)label是viewcontroller的屬性色徘,那么你要把這個(gè)屬性設(shè)置成nil恭金,以免占用不必要的內(nèi)存,而這個(gè)label在viewDidLoad時(shí)會(huì)重新創(chuàng)建褂策。
  7. 接下來(lái)看看ViewController中的view是如何被卸載的:
    當(dāng)系統(tǒng)發(fā)出內(nèi)存警告時(shí)横腿,會(huì)調(diào)用didReceiveMemoeryWarning方法,如果當(dāng)前有能被釋放的view斤寂,系統(tǒng)會(huì)調(diào)用viewWillUnload方法來(lái)釋放view耿焊,完成后調(diào)用viewDidUnload方法,至此遍搞,view就被卸載了罗侯。此時(shí)原本指向view的變量要被置為nil,具體操作是在viewDidUnload方法中調(diào)用self.myButton = nil;

小結(jié)

小結(jié)一下:loadView和viewDidLoad的區(qū)別就是溪猿,loadView時(shí)view還沒(méi)有生成钩杰,viewDidLoad時(shí),view已經(jīng)生成了诊县,loadView只會(huì)被調(diào)用一次讲弄,而viewDidLoad可能會(huì)被調(diào)用多次(View可能會(huì)被多次加載),當(dāng)view被添加到其他view中之前依痊,會(huì)調(diào)用viewWillAppear避除,之后會(huì)調(diào)用viewDidAppear。當(dāng)view從其他view中移除之前胸嘁,調(diào)用viewWillDisAppear瓶摆,移除之后會(huì)調(diào)用viewDidDisappear。當(dāng)view不再使用時(shí)缴渊,受到內(nèi)存警告時(shí)赏壹,ViewController會(huì)將view釋放并將其指向?yàn)閚il。

重要的事情在最后

ViewController的生命周期中各方法執(zhí)行流程如下:init—>loadView—>viewDidLoad—>viewWillApper—>viewDidApper—>viewWillDisapper—>viewDidDisapper—>viewWillUnload->viewDidUnload—>dealloc

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末衔沼,一起剝皮案震驚了整個(gè)濱河市蝌借,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌指蚁,老刑警劉巖菩佑,帶你破解...
    沈念sama閱讀 218,682評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異凝化,居然都是意外死亡稍坯,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)瞧哟,“玉大人混巧,你說(shuō)我怎么就攤上這事∏诳” “怎么了咧党?”我有些...
    開(kāi)封第一講書人閱讀 165,083評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)陨亡。 經(jīng)常有香客問(wèn)我傍衡,道長(zhǎng),這世上最難降的妖魔是什么负蠕? 我笑而不...
    開(kāi)封第一講書人閱讀 58,763評(píng)論 1 295
  • 正文 為了忘掉前任蛙埂,我火速辦了婚禮,結(jié)果婚禮上遮糖,老公的妹妹穿的比我還像新娘绣的。我一直安慰自己,他們只是感情好欲账,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,785評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布被辑。 她就那樣靜靜地躺著,像睡著了一般敬惦。 火紅的嫁衣襯著肌膚如雪盼理。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 51,624評(píng)論 1 305
  • 那天俄删,我揣著相機(jī)與錄音宏怔,去河邊找鬼。 笑死畴椰,一個(gè)胖子當(dāng)著我的面吹牛臊诊,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播斜脂,決...
    沈念sama閱讀 40,358評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼抓艳,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了帚戳?” 一聲冷哼從身側(cè)響起玷或,我...
    開(kāi)封第一講書人閱讀 39,261評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎片任,沒(méi)想到半個(gè)月后偏友,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,722評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡对供,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年位他,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,030評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡鹅髓,死狀恐怖舞竿,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情窿冯,我是刑警寧澤炬灭,帶...
    沈念sama閱讀 35,737評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站靡菇,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏米愿。R本人自食惡果不足惜厦凤,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,360評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望育苟。 院中可真熱鬧较鼓,春花似錦、人聲如沸违柏。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,941評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)漱竖。三九已至禽篱,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間馍惹,已是汗流浹背躺率。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,057評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留万矾,地道東北人悼吱。 一個(gè)月前我還...
    沈念sama閱讀 48,237評(píng)論 3 371
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像良狈,于是被迫代替她去往敵國(guó)和親后添。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,976評(píng)論 2 355

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