一畦戒、 大體流程:
-
(loadView/nib)
文件來加載view到內(nèi)存-->viewDidLoad
函數(shù)進(jìn)一步初始化這些view-->內(nèi)存不足時, 調(diào)用viewDidUnload
函數(shù)釋放views-->當(dāng)需要使用view時又回到第一步 -
loadView:
永遠(yuǎn)不要主導(dǎo)調(diào)用這個函數(shù)白华。viewController 會在view的property被請求并且當(dāng)前view值為nil時調(diào)用這個函數(shù)。如果你手動創(chuàng)建view, 你應(yīng)該重載這個函數(shù),切不要在重載的時候調(diào)用[super loadView]倡鲸。 -
viewDidload:
這個函數(shù)的作用主要是讓你可以進(jìn)一步的初始化你的views。viewDidLoad通常負(fù)責(zé)的是view及其子view被加載進(jìn)內(nèi)存之后的數(shù)據(jù)初始化的工作黄娘,即視圖的數(shù)據(jù)部分的初始化 -
viewDidUnLoad:
這個函數(shù)時viewDidLoad的對立函數(shù)峭状。在程序內(nèi)存欠缺時克滴,這個函數(shù)被controller調(diào)用,來釋放他的view以及view相關(guān)的對象优床。由于controller通常保存著view以及相關(guān)的object的引用劝赔,所以你必須使用這個函數(shù)來放棄這些對象的所有權(quán)以便內(nèi)存回收,但不要釋放那些難以重建的數(shù)據(jù) -
viewWillAppear:
視圖即將可見時調(diào)用胆敞,默認(rèn)情況下不執(zhí)行任何操作着帽。 -
viewWillLayoutSubViews:
視圖在顯示之前會布局子控件(將要布局子控件的時候調(diào)用) -
viewDidLayoutSubViews:
已經(jīng)布局完子控件的時候調(diào)用 -
viewDidAppear:
視圖已完全過渡到屏幕上時調(diào)用 -
viewWillDisappear:
視圖被駁回時調(diào)用,覆蓋或以其他方式隱藏移层,默認(rèn)情況下不執(zhí)行任何操作 -
viewDidDisappear:
視圖被駁回后調(diào)用仍翰,覆蓋或以其他方式隱藏。默認(rèn)情況下不執(zhí)行任何操作 -
didReceiveMemoryWarning:
當(dāng)程序內(nèi)存過度時观话,系統(tǒng)會調(diào)用該方法
二歉备、Controller和View的生命周期
- 這里指的View是指Controller的View。它作為Controler的屬性匪燕,生命周期在Controller的生命周期內(nèi)蕾羊。就是說你的Controller不能在view釋放前就釋放了。
- 當(dāng)你alloc并init了一個ViewController時帽驯,這個ViewController應(yīng)該是還沒有創(chuàng)建view的龟再。
- ViewController的view是使用了lazyInit方式創(chuàng)建,就是說你調(diào)用的view屬性的getter:[self view]尼变。在getter里會先判斷view是否創(chuàng)建利凑,如果沒有創(chuàng)建,那么會調(diào)用loadView來創(chuàng)建view嫌术。
- loadView完成時會繼續(xù)調(diào)用viewDidLoad哀澈。loadView和viewDidLoad的一個區(qū)別就是:loadView時還沒有view。而viewDidLoad時view以及創(chuàng)建好了度气。
- 當(dāng)view被添加其他view中之前時割按,會調(diào)用viewWillAppear,而view在顯示之前會先調(diào)用viewWillLayoutSubViews以及viewDidLayoutSubViews來布局子控件,而之后才會調(diào)用viewDidAppear磷籍。
- 當(dāng)view從其他view中移出之前時适荣,會調(diào)用viewWillDisAppear,而之后會調(diào)用viewDidDisappear院领。
- 當(dāng)view不在使用弛矛,而且是disappeared,受到內(nèi)存警告時比然,那么viewController會將view釋放并將其指向nil丈氓。
加載View的流程
1.先去判斷當(dāng)前控制器是不是從StoryBoard當(dāng)中加載的,如果是,那么它就會從StoryBoard當(dāng)中加載控制器的View.
2.如果不是從StoryBoard當(dāng)中加載的, 那么它還會判斷是不是從Xib當(dāng)中創(chuàng)建的控制器.如果是,那么它就會從xib加載控制器的View.
* 加載Xib的時候會先看看有沒有和控制器同名的Xib,有的話就加載;
* 如果沒有的話就會查找下有沒有控制器的名稱去掉controller的xib,有的話就去加載.
3.如果也不是從Xib加載的控制器.那么它就會創(chuàng)建一個空的UIView.設(shè)為當(dāng)前控制器的View.
三、代碼組織(如何設(shè)計良好的viewController)
ViewController生命周期中有那么多函數(shù),一個重要問題就是什么代碼該寫在什么地方万俗。
- 1鱼鼓、
init
里不要出現(xiàn)創(chuàng)建view的代碼。良好的設(shè)計该编,在init里應(yīng)該只有相關(guān)數(shù)據(jù)的初始化迄本,而且這些數(shù)據(jù)都是比較關(guān)鍵的數(shù)據(jù)。init里不要掉self.view课竣,否則會導(dǎo)致viewcontroller創(chuàng)建view嘉赎。(因為view是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方法路捧,但建議不要重載這個方法关霸。 - 3、
viewDidLoad
這時候view已經(jīng)有了杰扫,最適合創(chuàng)建一些附加的view和控件了队寇。 - 4、
viewWillAppear
這個一般在view被添加到superview之前章姓,切換動畫之前調(diào)用佳遣。在這里可以進(jìn)行一些顯示前的處理。比如鍵盤彈出凡伊,一些特殊的過程動畫(比如狀態(tài)條和navigationbar顏色)零渐。 - 5、
viewWillLayoutSubViews
一般用于顯示前,對子控件進(jìn)行布局 - 6系忙、
viewWillLayoutSubViews
子控件布局完成,可以在這方法里面對子控件進(jìn)行一些初始化操作. - 7诵盼、
viewDidAppear
一般用于顯示后,在切換動畫后笨觅,如果有需要的操作拦耐,可以在這里加入相關(guān)代碼耕腾。 - 8见剩、
viewDidUnload
這時候viewController的view已經(jīng)是nil了。由于這一般發(fā)生在內(nèi)存警告時扫俺,所以在這里你應(yīng)該將那些不在顯示的view釋放了苍苞。比如你在viewcontroller的view上加了一個label,而且這個label是viewcontroller的屬性,那么你要把這個屬性設(shè)置成nil羹呵,以免占用不必要的內(nèi)存骂际,而這個label在viewDidLoad時會重新創(chuàng)建。 - 9冈欢、接下來看看ViewController中的view是如何被卸載的:當(dāng)系統(tǒng)發(fā)出內(nèi)存警告時歉铝,會調(diào)用
didReceiveMemoeryWarning
方法,如果當(dāng)前有能被釋放的view凑耻,系統(tǒng)會調(diào)用viewWillUnload
方法來釋放view太示,完成后調(diào)用viewDidUnload方法,至此香浩,view就被卸載了类缤。此時原本指向view的變量要被置為nil,具體操作是在viewDidUnload
方法中調(diào)用self.myButton = nil; - 小結(jié)一下:
loadView
和viewDidLoad
的區(qū)別就是邻吭,loadView
時view還沒有生成餐弱,viewDidLoad
時,view已經(jīng)生成了囱晴,loadView
只會被調(diào)用一次膏蚓,而viewDidLoad
可能會被調(diào)用多次(View可能會被多次加載),當(dāng)view被添加到其他view中之前畸写,會調(diào)用viewWillAppear
降允,之后會調(diào)用viewDidAppear
。當(dāng)view從其他view中移除之前艺糜,調(diào)用viewWillDisAppear
剧董,移除之后會調(diào)用viewDidDisappear
。當(dāng)view不再使用時破停,受到內(nèi)存警告時翅楼,ViewController會將view釋放并將其指向為nil。
ViewController的生命周期中各方法執(zhí)行流程如下:init—>loadView—>viewDidLoad—>viewWillAppear—>viewWillLayoutSubViews—>viewDidLayoutSubViews—>viewDidAppear—>viewWillDisappear—>viewDidDisappear—>viewWillUnload->viewDidUnload—>dealloc