當(dāng)一個(gè)視圖控制器被創(chuàng)建,并在屏幕上顯示的時(shí)候钮热。代碼的執(zhí)行順序
1填抬、alloc創(chuàng)建對(duì)象,分配空間
2隧期、init (initWithNibName)初始化對(duì)象飒责,初始化數(shù)據(jù)
3、loadView從nib載入視圖仆潮,通常這一步不需要去干涉宏蛉。除非你沒有使用xib文件創(chuàng)建視圖
4、viewDidLoad載入完成性置,可以進(jìn)行自定義數(shù)據(jù)以及動(dòng)態(tài)創(chuàng)建其他控件
5拾并、viewWillAppear視圖將出現(xiàn)在屏幕之前,馬上這個(gè)視圖就會(huì)被展現(xiàn)在屏幕上了
6、viewDidAppear視圖已在屏幕上渲染完成
當(dāng)一個(gè)視圖被移除屏幕并且銷毀的時(shí)候的執(zhí)行順序嗅义,這個(gè)順序差不多和上面的相反
1屏歹、viewWillDisappear視圖將被從屏幕上移除之前執(zhí)行
2、viewDidDisappear視圖已經(jīng)被從屏幕上移除之碗,用戶看不到這個(gè)視圖了
3蝙眶、dealloc視圖被銷毀,此處需要對(duì)你在init和viewDidLoad中創(chuàng)建的對(duì)象進(jìn)行釋放
關(guān)于viewDidUnload :在發(fā)生內(nèi)存警告的時(shí)候如果本視圖不是當(dāng)前屏幕上正在顯示的視圖的話继控,
viewDidUnload將會(huì)被執(zhí)行械馆,本視圖的所有子視圖將被銷毀,以釋放內(nèi)存,此時(shí)開發(fā)者需要手動(dòng)對(duì)viewLoad武通、viewDidLoad中創(chuàng)建的對(duì)象釋放內(nèi)存。
因?yàn)楫?dāng)這個(gè)視圖再次顯示在屏幕上的時(shí)候珊搀,viewLoad冶忱、viewDidLoad再次被調(diào)用,以便再次構(gòu)造視圖境析。
1)- (void)viewDidLoad囚枪;
一個(gè)APP在載入時(shí)會(huì)先通過調(diào)用loadView方法或者載入IB中創(chuàng)建的初始界面的方法,將視圖載入到內(nèi)存中劳淆。然后會(huì)調(diào)用viewDidLoad方法來進(jìn)行進(jìn)一步的設(shè)置链沼。通常,我們對(duì)于各種初始數(shù)據(jù)的載入沛鸵,初始設(shè)定等很多內(nèi)容括勺,都會(huì)在這個(gè)方法中實(shí)現(xiàn),所以這個(gè)方法是一個(gè)很常用曲掰,很重要的方法
這個(gè)方法只會(huì)在APP剛開始加載的時(shí)候調(diào)用一次疾捍,以后都不會(huì)再調(diào)用它了,所以只能用來做初始設(shè)置栏妖。
2) - (void)viewDidUnload;
在內(nèi)存足夠的情況下乱豆,軟件的視圖通常會(huì)一直保存在內(nèi)存中,但是如果內(nèi)存不夠吊趾,一些沒有正在顯示的viewcontroller就會(huì)收到內(nèi)存不夠的警告宛裕,然后就會(huì)釋放自己擁有的視圖,以達(dá)到釋放內(nèi)存的目的论泛。但是系統(tǒng)只會(huì)釋放內(nèi)存揩尸,并不會(huì)釋放對(duì)象的所有權(quán),所以通常我們需要在這里將不需要在內(nèi)存中保留的對(duì)象釋放所有權(quán)孵奶,也就是將其指針置為nil疲酌。
這個(gè)方法通常并不會(huì)在視圖變換的時(shí)候被調(diào)用,而只會(huì)在系統(tǒng)退出或者收到內(nèi)存警告的時(shí)候才會(huì)被調(diào)用。但是由于我們需要保證在收到內(nèi)存警告的時(shí)候能夠?qū)ζ渥鞒龇磻?yīng)朗恳,所以這個(gè)方法通常我們都需要去實(shí)現(xiàn)湿颅。
另外,即使在設(shè)備上按了Home鍵之后粥诫,系統(tǒng)也不一定會(huì)調(diào)用這個(gè)方法油航,因?yàn)镮OS4之后,系統(tǒng)允許將APP在后臺(tái)掛起怀浆,并將其繼續(xù)滯留在內(nèi)存中谊囚,因此,viewcontroller并不會(huì)調(diào)用這個(gè)方法來清除內(nèi)存执赡。
3)- (void)viewWillAppear:(BOOL)animated;
系統(tǒng)在載入所有數(shù)據(jù)后镰踏,將會(huì)在屏幕上顯示視圖,這時(shí)會(huì)先調(diào)用這個(gè)方法沙合。通常我們會(huì)利用這個(gè)方法奠伪,對(duì)即將顯示的視圖做進(jìn)一步的設(shè)置。例如首懈,我們可以利用這個(gè)方法來設(shè)置設(shè)備不同方向時(shí)該如何顯示绊率。
當(dāng)APP有多個(gè)視圖時(shí),在視圖間切換時(shí)究履,并不會(huì)再次載入viewDidLoad方法滤否,所以如果在調(diào)入視圖時(shí),需要對(duì)數(shù)據(jù)做更新最仑,就只能在這個(gè)方法內(nèi)實(shí)現(xiàn)了藐俺。所以這個(gè)方法也非常常用。
4) - (void)viewDidAppear:(BOOL)animated盯仪;
有時(shí)候紊搪,由于一些特殊的原因,我們不能在viewWillApper方法里全景,對(duì)視圖進(jìn)行更新耀石。那么可以重寫這個(gè)方法,在這里對(duì)正在顯示的視圖進(jìn)行進(jìn)一步的設(shè)置爸黄。
5) - (void)viewWillDisappear:(BOOL)animated滞伟;
在視圖變換時(shí),當(dāng)前視圖在即將被移除炕贵、或者被覆蓋時(shí)梆奈,會(huì)調(diào)用這個(gè)方法進(jìn)行一些善后的處理和設(shè)置。
由于在IOS4之后称开,系統(tǒng)允許將APP在后臺(tái)掛起亩钟,所以在按了Home鍵之后乓梨,系統(tǒng)并不會(huì)調(diào)用這個(gè)方法,因?yàn)榫瓦@個(gè)APP本身而言清酥,APP顯示的view扶镀,仍是掛起時(shí)候的view,所以并不會(huì)調(diào)用這個(gè)方法焰轻。
6) - (void)viewDidDisappear:(BOOL)animated臭觉;
我們可以重寫這個(gè)方法,對(duì)已經(jīng)消失辱志,或者被覆蓋蝠筑,或者已經(jīng)隱藏了的視圖做一些其他操作。
啟動(dòng)的順序可以概括為:
運(yùn)行app->載入視圖->調(diào)用viewdidload方法->
viewwillappear-> viewdidappear ->載入新的view->釋放對(duì)象的所有權(quán)->調(diào)用對(duì)象的viewdidunload->收到內(nèi)存的警告- >調(diào)用viewDidDisappear<—調(diào)用viewWillDisappear?<—
APP需要調(diào)用另一個(gè)view
一揩懒、loadView
永遠(yuǎn)不要主動(dòng)調(diào)用這個(gè)函數(shù)什乙。view controller會(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]稳强。如果你用IB創(chuàng)建view并初始化view
controller,那就意味著你使用initWithNibName:bundle:方法和悦,這時(shí),你不應(yīng)該重載loadView函數(shù)渠缕。
這個(gè)方法系統(tǒng)的默認(rèn)實(shí)現(xiàn)是這樣:
1;尋找有關(guān)可用的nib文件的信息鸽素,根據(jù)這個(gè)信息來加載nib文件//所以,nib的加載過程是在loadview中完成的哦亦鳞。
2;如果沒有有關(guān)nib文件的信息馍忽,默認(rèn)創(chuàng)建一個(gè)空白的UIView對(duì)象,然后把對(duì)象成賦值給viewcontroller的主view燕差。
所以遭笋,如果你決定重載這個(gè)函數(shù)時(shí),你也應(yīng)該完成這些步驟:
把子類的view賦給view屬性(property)(你create的view必須是唯一的實(shí)例徒探,并且不被其他任何controller共享)瓦呼,而且你重載的這個(gè)函數(shù)不應(yīng)該調(diào)用super,這個(gè)也是為了保持主view與controller的單一映射關(guān)系测暗。
二央串、viewDidLoad
這個(gè)函數(shù)在controller加載了相關(guān)的views后被調(diào)用,而不論這些views存儲(chǔ)在nib文件里還是在loadView函數(shù)中生成碗啄。
這個(gè)函數(shù)的作用主要是讓你可以進(jìn)一步的初始化你的views质和。viewDidLoad通常負(fù)責(zé)的是view及其子view被加載進(jìn)內(nèi)存之后的數(shù)據(jù)初始化的工作,即視圖的數(shù)據(jù)部分的初始化稚字。在iOS 3.0以及更高版本中饲宿,你應(yīng)該重載viewDidUnload函數(shù)來釋放任何對(duì)view的引用或者它里面的內(nèi)容(子view等等)厦酬。
其多數(shù)情況下是做nib文件的后續(xù)工作。
所以流程應(yīng)該是這樣:
loadView來加載view(無論nib文件或自定義的views)到內(nèi)存——>viewDidLoad函數(shù)進(jìn)一步初始化這些view(通常是側(cè)重于數(shù)據(jù)data的初始化)——>內(nèi)存不足時(shí)瘫想,調(diào)用viewDidUnload函數(shù)釋放views