一、ViewController的生命周期(如圖1)會(huì)經(jīng)歷初始化、加載視圖殴俱、銷(xiāo)毀視圖、生命結(jié)束等過(guò)程枚抵,詳細(xì)過(guò)程如下:
1. init
初始化ViewController
2.loadView
當(dāng)view需要被展示而它卻是nil時(shí)线欲,viewController會(huì)調(diào)用該方法。如果代碼維護(hù)View的話(huà)需要重寫(xiě)此方法汽摹,使用xib維護(hù)View的話(huà)不用重寫(xiě)李丰。
3.viewDidLoad
執(zhí)行完loadView后繼續(xù)執(zhí)行viewDidLoad,loadView時(shí)還沒(méi)有view逼泣,而viewDidLoad時(shí)view已經(jīng)創(chuàng)建好了趴泌。
4.viewWillAppear?
視圖將出現(xiàn)在屏幕之前,馬上這個(gè)視圖就會(huì)被展現(xiàn)在屏幕上了;
5.viewDidAppear??
視圖已在屏幕上渲染完成 當(dāng)一個(gè)視圖被移除屏幕并且銷(xiāo)毀的時(shí)候的執(zhí)行順序拉庶,這個(gè)順序差不多和上面的相反;
6.viewWillDisappear
視圖將被從屏幕上移除之前執(zhí)行
7.viewDidDisappear
視圖已經(jīng)被從屏幕上移除嗜憔,用戶(hù)看不到這個(gè)視圖了
8.viewWillUnload
如果當(dāng)前有能被釋放的view,系統(tǒng)會(huì)調(diào)用viewWillUnload方法來(lái)釋放view
9.viewDidUnload
當(dāng)系統(tǒng)內(nèi)存吃緊的時(shí)候會(huì)調(diào)用該方法砍的,在iOS 3.0之前didReceiveMemoryWarning是釋放無(wú)用內(nèi)存的唯一方式痹筛,但是iOS 3.0及以后viewDidUnload方法是更好的方式莺治。在該方法中將所有IBOutlet(無(wú)論是property還是實(shí)例變量)置為nil(系統(tǒng)release view時(shí)已經(jīng)將其release掉了)廓鞠。在該方法中釋放其他與view有關(guān)的對(duì)象、其他在運(yùn)行時(shí)創(chuàng)建(但非系統(tǒng)必須)的對(duì)象谣旁、在viewDidLoad中被創(chuàng)建的對(duì)象床佳、緩存數(shù)據(jù)等。一般認(rèn)為viewDidUnload是viewDidLoad的鏡像榄审,因?yàn)楫?dāng)view被重新請(qǐng)求時(shí)砌们,viewDidLoad還會(huì)重新被執(zhí)行。
10.dealloc
視圖被銷(xiāo)毀,此處需要對(duì)你在init和viewDidLoad中創(chuàng)建的對(duì)象進(jìn)行釋放.關(guān)于viewDidUnload :在發(fā)生內(nèi)存警告的時(shí)候如果本視圖不是當(dāng)前屏幕上正在顯示的視圖的話(huà)浪感,viewDidUnload將會(huì)被執(zhí)行昔头,本視圖的所有子視圖將被銷(xiāo)毀以釋放內(nèi)存,此時(shí)開(kāi)發(fā)者需要手動(dòng)對(duì)viewLoad、viewDidLoad中創(chuàng)建的對(duì)象釋放內(nèi)存影兽。因?yàn)楫?dāng)這個(gè)視圖再次顯示在屏幕上的時(shí)候揭斧,viewLoad、viewDidLoad 再次被調(diào)用峻堰,以便再次構(gòu)造視圖讹开。
二、ViewController加載view過(guò)程捐名,見(jiàn)圖2
從圖中可以看到旦万,在view加載過(guò)程中首先會(huì)調(diào)用loadView方法,在這個(gè)方法中主要完成一些關(guān)鍵view的初始化工作镶蹋,比如UINavigationViewController和UITabBarController等容器類(lèi)的ViewController成艘;接下來(lái)就是加載view,加載成功后贺归,會(huì)接著調(diào)用viewDidLoad方法狰腌,這里要記住的一點(diǎn)是,在loadView之前牧氮,是沒(méi)有view的琼腔,也就是說(shuō),在這之前踱葛,view還沒(méi)有被初始化丹莲。完成viewDidLoad方法后,ViewController里面就成功的加載view了尸诽,如上圖右下角所示甥材。
三、ViewController卸載View過(guò)程性含,見(jiàn)圖3
從圖中可以看到洲赵,當(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é):
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