iOS視圖控制對(duì)象生命周期-init菜谣、viewDidLoad珠漂、viewWillAppear、viewDidAppear尾膊、viewWillDisappear媳危、viewDidDisappear的區(qū)別及用途
init-初始化程序
viewDidLoad-加載視圖
viewWillAppear-UIViewController對(duì)象的視圖即將加入窗口時(shí)調(diào)用;
viewDidApper-UIViewController對(duì)象的視圖已經(jīng)加入到窗口時(shí)調(diào)用冈敛;
viewWillDisappear-UIViewController對(duì)象的視圖即將消失待笑、被覆蓋或是隱藏時(shí)調(diào)用;
viewDidDisappear-UIViewController對(duì)象的視圖已經(jīng)消失抓谴、被覆蓋或是隱藏時(shí)調(diào)用暮蹂;
viewVillUnload-當(dāng)內(nèi)存過(guò)低時(shí),需要釋放一些不需要使用的視圖時(shí)癌压,即將釋放時(shí)調(diào)用仰泻;
viewDidUnload-當(dāng)內(nèi)存過(guò)低,釋放一些不需要的視圖時(shí)調(diào)用滩届。
視圖控制對(duì)象通過(guò)alloc和init來(lái)創(chuàng)建我纪,但是視圖控制對(duì)象不會(huì)在創(chuàng)建的那一刻就馬上創(chuàng)建相應(yīng)的視圖,而是等到需要使用的時(shí)候才通過(guò)調(diào)用loadView來(lái)創(chuàng)建丐吓,這樣的做法能提高內(nèi)存的使用率。比如趟据,當(dāng)某個(gè)標(biāo)簽有很多UIViewController對(duì)象券犁,那么對(duì)于任何一個(gè)UIViewController對(duì)象的視圖,只有相應(yīng)的標(biāo)簽被選中時(shí)才會(huì)被創(chuàng)建出來(lái)汹碱。
比如如下代碼:
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
// Custom initialization
UITabBarItem *tbi = [self tabBarItem];
[tbi setTitle:@"CurrentTime"];
[[self view ] setBackgroundColor:[UIColor yellowColor]];
}
return self;
}
我們將UIViewController的init方法中訪問(wèn)的實(shí)例變量view在init中將背景設(shè)置為黃色粘衬,運(yùn)行程序,我們能發(fā)現(xiàn)背景的確變成了黃色,但是稚新,在我們還沒(méi)有需要使用視圖的時(shí)候勘伺,該視圖已經(jīng)加載好了,在UIViewController的初始方法中訪問(wèn)實(shí)例變量view褂删,會(huì)導(dǎo)致延遲載入機(jī)制失效飞醉,這個(gè)問(wèn)題看上去不是很嚴(yán)重,但是如果考慮到內(nèi)存過(guò)低警告屯阀,那么問(wèn)題就大了缅帘。。难衰。
運(yùn)行程序钦无,選擇模擬器中的硬件->模擬內(nèi)存過(guò)低警告,我們會(huì)發(fā)現(xiàn)盖袭,原本設(shè)置的黃色背景不見(jiàn)了失暂,這是因?yàn)椋瑑?nèi)存過(guò)低鳄虱,視圖控制對(duì)象會(huì)在發(fā)出內(nèi)存過(guò)低警告時(shí)收到didReceiveMemoryWarning消息弟塞,該方法默認(rèn)實(shí)現(xiàn),檢查視圖控制對(duì)象的視圖是否可見(jiàn)醇蝴,如果不可見(jiàn)宣肚,則釋放掉,下次在加載該視圖時(shí)就不會(huì)執(zhí)行init方法悠栓,而是只執(zhí)行viewDidLoad方法霉涨,所以需要將[[selfview ] setBackgroundColor:[UIColoryellowColor]];放到viewDidLoad中,這樣如果視圖因?yàn)閮?nèi)存過(guò)低被釋放掉了惭适,下次需要使用到該視圖的時(shí)候笙瑟,程序會(huì)默認(rèn)取執(zhí)行該視圖的viewDidLoad方法,這樣背景顏色就又出來(lái)了癞志。
init往枷、viewDidLoad、viewWillAppear凄杯、viewDidAppear错洁、viewWillDisappear、viewDidDisappear的執(zhí)行順序:
從程序的log來(lái)看:
2012-10-19 15:51:44.811inHyron[483:b903] init
2012-10-19 15:51:54.081inHyron[483:b903] viewDidLoad
2012-10-19 15:51:54.082inHyron[483:b903] viewVillAppear
2012-10-19 15:51:54.084 inHyron[483:b903] viewDidAppear
很明顯戒突,先執(zhí)行init屯碴、然后執(zhí)行viewDidLoad,然后是viewWillAppear最后是viewDidAppear膊存,這樣視圖就創(chuàng)建好了导而,當(dāng)視圖消失或者被覆蓋的時(shí)候:
2012-10-19 15:54:14.557inHyron[483:b903] viewWillDisappear
2012-10-19 15:54:14.558inHyron[483:b903] viewDidDisappear
這樣一來(lái)視圖就消失了忱叭,當(dāng)模擬內(nèi)存警告的時(shí)候:
2012-10-19 15:55:14.333inHyron[483:b903] Received simulated memory warning.
2012-10-19 15:55:14.334inHyron[483:b903] viewWillUnload
2012-10-19 15:55:14.335 inHyron[483:b903]viewDidUnload
從log可以看出,當(dāng)視圖控制對(duì)象收到內(nèi)存警告的時(shí)候今艺,程序會(huì)執(zhí)行viewWillUnload最后是執(zhí)行viewDidUnload韵丑。