viewController的生命周期
一、結(jié)構(gòu)
按結(jié)構(gòu)可以對iOS的所有ViewController分成兩類:
1、主要用于展示內(nèi)容的ViewController,這種ViewController主要用于為用戶展示內(nèi)容,并與用戶交互,如UITableViewController,UIViewController。
2、用于控制和顯示其他ViewController的ViewController。這種ViewController一般都是一個ViewController的容器。如UINavigationController,UITabbarController。它們都有一個屬性:viewControllers。其中UINavigationController表示一種Stack式結(jié)構(gòu),push一個ViewController或pop一次,因此后一個ViewController一般會依賴前一個ViewController。而UITabbarController表示一個Array結(jié)構(gòu),各個ViewController是并列的。
第一種ViewController會經(jīng)常被繼承,用來顯示不同的數(shù)據(jù)給用戶。而第二種很少被繼承,除非你真的需要自定義它。
注:細心的同學(xué)應(yīng)該能發(fā)現(xiàn),在Xcode中新建一個ViewController時,只可以選擇繼承自UIViewController和UITableViewController,而它們都是第一種。
二、Controller和View的生命周期
這里指的View是指Controller的View。它作為Controler的屬性,生命周期在Controller的生命周期內(nèi)。就是說你的Controller不能在view釋放前就釋放了。
ViewController生命周期
當(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,而之后會調(diào)用viewDidAppear。
當(dāng)view從其他view中移出之前時,會調(diào)用viewWillDisAppear,而之后會調(diào)用viewDidDisappear。
當(dāng)view不在使用,而且是disappeared,受到內(nèi)存警告時,那么viewController會將view釋放并將其指向nil。
三、代碼組織(如何設(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和控件了。有一點需要注意的是,viewDidLoad會調(diào)用多次(viewcontroller可能多次載入view,參見圖2)。
4、viewWillAppear 這個一般在view被添加到superview之前,切換動畫之前調(diào)用。在這里可以進行一些顯示前的處理。比如鍵盤彈出,一些特殊的過程動畫(比如狀態(tài)條和navigationbar顏色)。
5、viewDidAppear 一般用于顯示后,在切換動畫后,如果有需要的操作,可以在這里加入相關(guān)代碼。 6、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)建
轉(zhuǎn)載于:https://www.cnblogs.com/pengjuwang/p/5052233.html
總結(jié)
以上是生活随笔為你收集整理的viewController的生命周期的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 爱憎分明我痴情
- 下一篇: 1500元左右的家用投影机,很差吗?,