天天看點

iOS視圖控制對象生命周期-init、viewDidLoad、viewWillAppear、viewDidAppear、viewWillDisappear、view

ios視圖控制對象生命周期:

init、viewdidload、viewwillappear、viewdidappear、viewwilldisappear、viewdiddisappear的差別及用途

init-初始化程式

viewdidload-加載視圖

viewwillappear-uiviewcontroller對象的視圖即将加入視窗時調用;

viewdidapper-uiviewcontroller對象的視圖已經加入到視窗時調用;

viewwilldisappear-uiviewcontroller對象的視圖即将消失、被覆寫或是隐藏時調用;

viewdiddisappear-uiviewcontroller對象的視圖已經消失、被覆寫或是隐藏時調用;

viewvillunload-當記憶體過低時,需要釋放一些不需要使用的視圖時,即将釋放時調用;

viewdidunload-當記憶體過低,釋放一些不需要的視圖時調用。

        視圖控制對象通過alloc和init來建立,但是視圖控制對象不會在建立的那一刻就馬上建立相應的視圖,而是等到需要使用的時候才通過調用loadview來建立,這樣的做法能提高記憶體的使用率。比如,當某個标簽有很多uiviewcontroller對象,那麼對于任何一個uiviewcontroller對象的視圖,隻有相應的标簽被選中時才會被建立出來。

比如如下代碼:

我們将uiviewcontroller的init方法中通路的執行個體變量view在init中将背景設定為黃.色,運作程式,我們能發現背景的确變成了黃.色,但是,在我們還沒有需要使用視圖的時候,該視圖已經加載好了,在uiviewcontroller的初始方法中通路執行個體變量view,會導緻延遲載入機制失效,這個問題看上去不是很嚴重,但是如果考慮到記憶體過低警告,那麼問題就大了。。。

運作程式,選擇模拟器中的硬體->模拟記憶體過低警告,我們會發現,原本設定的黃.色背景不見了,這是因為,記憶體過低,視圖控制對象會在發出記憶體過低警告時收到didreceivememorywarning消息,該方法預設實作,檢查視圖控制對象的視圖是否可見,如果不可見,則釋放掉,下次在加載該視圖時就不會執行init方法,而是隻執行viewdidload方法,是以需要将[[selfview ] setbackgroundcolor:[uicoloryellowcolor]];放到viewdidload中,這樣如果視圖因為記憶體過低被釋放掉了,下次需要使用到該視圖的時候,程式會預設取執行該視圖的viewdidload方法,這樣背景顔色就又出來了。

init、viewdidload、viewwillappear、viewdidappear、viewwilldisappear、viewdiddisappear的執行順序:

 從程式的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

很明顯,先執行init、然後執行viewdidload,然後是viewwillappear最後是viewdidappear,這樣視圖就建立好了,當視圖消失或者被覆寫的時候:

2012-10-19 15:54:14.557inhyron[483:b903] viewwilldisappear

2012-10-19 15:54:14.558inhyron[483:b903] viewdiddisappear

這樣一來視圖就消失了,當模拟記憶體警告的時候:

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可以看出,當視圖控制對象收到記憶體警告的時候,程式會執行viewwillunload最後是執行viewdidunload。

這樣,一套的流程就完成了,不知道寫的是否詳細。。。。

摘自:http://blog.sina.com.cn/s/blog_5da93c8f0101q3f6.html

繼續閱讀