ViewController的生命周期中各方法執(zhí)行流程如下:
init—>loadView—>viewDidLoad—>viewWillApper—>viewDidApper—>viewWillDisapper—>viewDidDisapper—>viewWillUnload->viewDidUnload—>dealloc
UIViewController生命周期:
1)- (void)viewDidLoad刃泡;
一個APP在載入時會先通過調(diào)用loadView方法或者載入IB中創(chuàng)建的初始界面的方法纺座,將視圖載入到內(nèi)存中容劳。然后會調(diào)用viewDidLoad方法來進(jìn)行進(jìn)一步的設(shè)置。通常涧至,我們對于各種初始數(shù)據(jù)的載入贩绕,初始設(shè)定等很多內(nèi)容碑隆,都會在這個方法中實(shí)現(xiàn)州袒,所以這個方法是一個很常用,很重要的方法递鹉,這個時候約束還沒有生效盟步,在這里拿到的使用約束的控件的frame是假的。
但是要注意躏结,這個方法只會在APP剛開始加載的時候調(diào)用一次却盘,以后都不會再調(diào)用它了,所以只能用來做初始設(shè)置媳拴。
2) - (void)viewDidUnload;
在內(nèi)存足夠的情況下黄橘,軟件的視圖通常會一直保存在內(nèi)存中,但是如果內(nèi)存不夠屈溉,一些沒有正在顯示的viewcontroller就會收到內(nèi)存不夠的警告塞关,然后就會釋放自己擁有的視圖,以達(dá)到釋放內(nèi)存的目的子巾。但是系統(tǒng)只會釋放內(nèi)存帆赢,并不會釋放對象的所有權(quán),所以通常我們需要在這里將不需要在內(nèi)存中保留的對象釋放所有權(quán)砰左,也就是將其指針置為nil匿醒。
這個方法通常并不會在視圖變換的時候被調(diào)用,而只會在系統(tǒng)退出或者收到內(nèi)存警告的時候才會被調(diào)用缠导。但是由于我們需要保證在收到內(nèi)存警告的時候能夠?qū)ζ渥鞒龇磻?yīng),所以這個方法通常我們都需要去實(shí)現(xiàn)溉痢。
另外僻造,即使在設(shè)備上按了Home鍵之后,系統(tǒng)也不一定會調(diào)用這個方法孩饼,因?yàn)镮OS4之后髓削,系統(tǒng)允許將APP在后臺掛起,并將其繼續(xù)滯留在內(nèi)存中镀娶,因此立膛,viewcontroller并不會調(diào)用這個方法來清除內(nèi)存。
3)- (void)viewWillAppear:(BOOL)animated;
系統(tǒng)在載入所有數(shù)據(jù)后,將會在屏幕上顯示視圖宝泵,這時會先調(diào)用這個方法好啰。通常我們會利用這個方法,對即將顯示的視圖做進(jìn)一步的設(shè)置儿奶。例如框往,我們可以利用這個方法來設(shè)置設(shè)備不同方向時該如何顯示。
另外一方面闯捎,當(dāng)APP有多個視圖時椰弊,在視圖間切換時,并不會再次載入viewDidLoad方法瓤鼻,所以如果在調(diào)入視圖時秉版,需要對數(shù)據(jù)做更新,就只能在這個方法內(nèi)實(shí)現(xiàn)了茬祷。所以這個方法也非常常用清焕。
4) - (void)viewDidAppear:(BOOL)animated;
有時候牲迫,由于一些特殊的原因耐朴,我們不能在viewWillApper方法里,對視圖進(jìn)行更新盹憎。那么可以重寫這個方法筛峭,在這里對正在顯示的視圖進(jìn)行進(jìn)一步的設(shè)置。
5) - (void)viewWillDisappear:(BOOL)animated陪每;
在視圖變換時影晓,當(dāng)前視圖在即將被移除、或者被覆蓋時檩禾,會調(diào)用這個方法進(jìn)行一些善后的處理和設(shè)置挂签。
由于在IOS4之后,系統(tǒng)允許將APP在后臺掛起盼产,所以在按了Home鍵之后饵婆,系統(tǒng)并不會調(diào)用這個方法,因?yàn)榫瓦@個APP本身而言戏售,APP顯示的view侨核,仍是掛起時候的view,所以并不會調(diào)用這個方法灌灾。
6) - (void)viewDidDisappear:(BOOL)animated搓译;
我們可以重寫這個方法,對已經(jīng)消失锋喜,或者被覆蓋些己,或者已經(jīng)隱藏了的視圖做一些其他操作。