當一個視圖控制器被建立,並在屏幕上顯示的時候。 代碼的執行順序
一、 alloc 建立對象,分配空間
二、init (initWithNibName) 初始化對象,初始化數據
三、loadView 從nib載入視圖 ,一般這一步不須要去幹涉。除非你沒有使用xib文件建立視圖
四、viewDidLoad 載入完成,能夠進行自定義數據以及動態建立其餘控件
五、viewWillAppear 視圖將出如今屏幕以前,立刻這個視圖就會被展示在屏幕上了
六、viewDidAppear 視圖已在屏幕上渲染完成編程
當一個視圖被移除屏幕而且銷燬的時候的執行順序,這個順序差很少和上面的相反
一、viewWillDisappear 視圖將被從屏幕上移除以前執行
二、viewDidDisappear 視圖已經被從屏幕上移除,用戶看不到這個視圖了
三、dealloc 視圖被銷燬,此處須要對你在init和viewDidLoad中建立的對象進行釋放app
關於viewDidUnload :在發生內存警告的時候若是本視圖不是當前屏幕上正在顯示的視圖的話, viewDidUnload將會被執行,本視圖的全部子視圖將被銷燬,以釋放內存,此時開發者須要手動對viewLoad、viewDidLoad中建立的對象釋放內存。 由於當這個視圖再次顯示在屏幕上的時候,viewLoad、viewDidLoad 再次被調用,以便再次構造視圖。iphone
當咱們建立一個UIViewController類的對象時,一般系統會生成幾個默認的方法,這些方法大多與視圖的調用有關,可是在視圖調用時,這些方法的調用順序如何,須要整理下。ui
一般上述方法包括以下幾種,這些方法都是UIViewController類的方法:this
- (void)viewDidLoad;spa
- (void)viewDidUnload;.net
- (void)viewWillAppear:(BOOL)animated;指針
- (void)viewDidAppear:(BOOL)animated;code
- (void)viewWillDisappear:(BOOL)animated;對象
- (void)viewDidDisappear:(BOOL)animated;
下面介紹下APP在運行時的調用順序。
1)- (void)viewDidLoad;
一個APP在載入時會先經過調用loadView方法或者載入IB中建立的初始界面的方法,將視圖載入到內存中。而後會調用viewDidLoad方法來進行進一步的設置。一般,咱們對於各類初始數據的載入,初始設定等不少內容,都會在這個方法中實現,因此這個方法是一個很經常使用,很重要的方法。
可是要注意,這個方法只會在APP剛開始加載的時候調用一次,之後都不會再調用它了,因此只能用來作初始設置。
2) - (void)viewDidUnload;
在內存足夠的狀況下,軟件的視圖一般會一直保存在內存中,可是若是內存不夠,一些沒有正在顯示的viewcontroller就會收到內存不夠的警告,而後就會釋放本身擁有的視圖,以達到釋放內存的目的。可是系統只會釋放內存,並不會釋放對象的全部權,因此一般咱們須要在這裏將不須要在內存中保留的對象釋放全部權,也就是將其指針置爲nil。
這個方法一般並不會在視圖變換的時候被調用,而只會在系統退出或者收到內存警告的時候纔會被調用。可是因爲咱們須要保證在收到內存警告的時候可以對其做出反應,因此這個方法一般咱們都須要去實現。
另外,即便在設備上按了Home鍵以後,系統也不必定會調用這個方法,由於IOS4以後,系統容許將APP在後臺掛起,並將其繼續滯留在內存中,所以,viewcontroller並不會調用這個方法來清除內存。
3)- (void)viewWillAppear:(BOOL)animated;
系統在載入全部數據後,將會在屏幕上顯示視圖,這時會先調用這個方法。一般咱們會利用這個方法,對即將顯示的視圖作進一步的設置。例如,咱們能夠利用這個方法來設置設備不一樣方向時該如何顯示。
另一方面,當APP有多個視圖時,在視圖間切換時,並不會再次載入viewDidLoad方法,因此若是在調入視圖時,須要對數據作更新,就只能在這個方法內實現了。因此這個方法也很是經常使用。
4) - (void)viewDidAppear:(BOOL)animated;
有時候,因爲一些特殊的緣由,咱們不能在viewWillApper方法裏,對視圖進行更新。那麼能夠重寫這個方法,在這裏對正在顯示的視圖進行進一步的設置。
5) - (void)viewWillDisappear:(BOOL)animated;
在視圖變換時,當前視圖在即將被移除、或者被覆蓋時,會調用這個方法進行一些善後的處理和設置。
因爲在IOS4以後,系統容許將APP在後臺掛起,因此在按了Home鍵以後,系統並不會調用這個方法,由於就這個APP自己而言,APP顯示的view,還是掛起時候的view,因此並不會調用這個方法。
6) - (void)viewDidDisappear:(BOOL)animated;
咱們能夠重寫這個方法,對已經消失,或者被覆蓋,或者已經隱藏了的視圖作一些其餘操做。
上述方法的流程圖能夠簡單用以下表示:
運行APP —> 載入視圖 —> 調用viewDidLoad方法 —> 調用viewWillAppear方法 —> 調用viewDidAppear方法 —> 正常運行
aaaaaaaa A |
aaaaaaaa | |
aaaaaaaa | 載入新的View |
aaaaaaaa | |
aaaaaaaa | V
釋放對象全部權 <— 調用viewDidUnload <— 收到內存警告 <— 調用viewDidDisappear <— 調用viewWillDisappear <— APP須要調用另外一個view
IOS程序啓動執行順序
http://www.yifeiyang.net/iphone-developer-advanced-3-iphone-application-startup-process/
iPhone開發必不可少的要用到這兩個方法。 他們均可以用來在視圖載入的時候,初始化一些內容。 可是他們有什麼區別呢?
viewDidLoad 此方法只有當view從nib文件初始化的時候才被調用。
loadView 此方法在控制器的view爲nil的時候被調用。 此方法用於以編程的方式建立view的時候用到。 如:
- ( void ) loadView {
UIView *view = [ [ UIView alloc] initWithFrame:[ UIScreen
mainScreen] .applicationFrame] ;
[ view setBackgroundColor:_color] ;
self.view = view;
[ view release] ;
}
你在控制器中實現了loadView方法,那麼你可能會在應用運行的某個時候被內存管理控制調用。 若是設備內存不足的時候, view 控制器會收到didReceiveMemoryWarning的消息。 默認的實現是檢查當前控制器的view是否在使用。若是它的view不在當前正在使用的view hierarchy裏面,且你的控制器實現了loadView方法,那麼這個view將被release, loadView方法將被再次調用來建立一個新的view。
--------------------------------------------------------------------------------------------------------------------------------------------
Don't read self.view in -loadView. Only set it, don't get it.
The self.view property accessor calls -loadView if the view isn't currently loaded. There's your infinite recursion.
The usual way to build the view programmatically in -loadView, as demonstrated in Apple's pre-Interface-Builder examples, is more like this:
UIView * view = [[ UIView alloc ] init ...]; ... [ view addSubview : whatever ]; [ view addSubview : whatever2 ]; ... self . view = view ; [ view release ];
And I don't blame you for not using IB. I've stuck with this method for all of Instapaper and find myself much more comfortable with it than dealing with IB's complexities, interface quirks, and unexpected behind-the-scenes behavior.