iOS視圖控制對象生命周期-init、viewDidLoad挺狰、viewWillAppear、viewDidAppear丰泊、viewWillDisappear、viewDidDisappear的區(qū)別及用途
init-初始化程序
viewDidLoad-加載視圖
viewWillAppear-UIViewController對象的視圖即將加入窗口時調(diào)用瞳购;
viewDidApper-UIViewController對象的視圖已經(jīng)加入到窗口時調(diào)用;
viewWillDisappear-UIViewController對象的視圖即將消失学赛、被覆蓋或是隱藏時調(diào)用年堆;
viewDidDisappear-UIViewController對象的視圖已經(jīng)消失、被覆蓋或是隱藏時調(diào)用嘀韧;
viewVillUnload-當內(nèi)存過低時,需要釋放一些不需要使用的視圖時锄贷,即將釋放時調(diào)用译蒂;
viewDidUnload-當內(nèi)存過低谊却,釋放一些不需要的視圖時調(diào)用。
視圖控制對象通過alloc和init來創(chuàng)建炎辨,但是視圖控制對象不會在創(chuàng)建的那一刻就馬上創(chuàng)建相應(yīng)的視圖,而是等到需要使用的時候才通過調(diào)用loadView來創(chuàng)建碴萧,這樣的做法能提高內(nèi)存的使用率。比如破喻,當某個標簽有很多UIViewController對象虎谢,那么對于任何一個UIViewController對象的視圖婴噩,只有相應(yīng)的標簽被選中時才會被創(chuàng)建出來。
比如如下代碼:
[plain]view plaincopy
-?(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方法中訪問的實例變量view在init中將背景設(shè)置為黃色几莽,運行程序,我們能發(fā)現(xiàn)背景的確變成了黃色宅静,但是,在我們還沒有需要使用視圖的時候坏为,該視圖已經(jīng)加載好了,在UIViewController的初始方法中訪問實例變量view匀伏,會導(dǎo)致延遲載入機制失效,這個問題看上去不是很嚴重够颠,但是如果考慮到內(nèi)存過低警告,那么問題就大了履磨。蛉抓。巷送。
運行程序,選擇模擬器中的硬件->模擬內(nèi)存過低警告矛辕,我們會發(fā)現(xiàn)付魔,原本設(shè)置的黃色背景不見了飞蹂,這是因為,內(nèi)存過低陈哑,視圖控制對象會在發(fā)出內(nèi)存過低警告時收到didReceiveMemoryWarning消息妻坝,該方法默認實現(xiàn)惊窖,檢查視圖控制對象的視圖是否可見,如果不可見界酒,則釋放掉,下次在加載該視圖時就不會執(zhí)行init方法盾计,而是只執(zhí)行viewDidLoad方法赁遗,所以需要將[[selfview]setBackgroundColor:[UIColoryellowColor]];放到viewDidLoad中,這樣如果視圖因為內(nèi)存過低被釋放掉了岩四,下次需要使用到該視圖的時候,程序會默認取執(zhí)行該視圖的viewDidLoad方法剖煌,這樣背景顏色就又出來了。
init耕姊、viewDidLoad桶唐、viewWillAppear茉兰、viewDidAppear、viewWillDisappear规脸、viewDidDisappear的執(zhí)行順序:
從程序的log來看:
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)建好了衫仑,當視圖消失或者被覆蓋的時候:
2012-10-19 15:54:14.557inHyron[483:b903] viewWillDisappear
2012-10-19 15:54:14.558inHyron[483:b903] viewDidDisappear
這樣一來視圖就消失了,當模擬內(nèi)存警告的時候:
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可以看出惑畴,當視圖控制對象收到內(nèi)存警告的時候,程序會執(zhí)行viewWillUnload最后是執(zhí)行viewDidUnload如贷。
這樣,一套的流程就完成了到踏,不知道寫的是否詳細。窝稿。。伴榔。
還有看的不明白的,可以取下我的小Demo:http://download.csdn.net/detail/weasleyqi/4664799踪少,在CurrentTimeViewController.m當中詳細的log都寫好了塘安,大家可以取研究研究援奢。