ObJective-C UIViewController生命周期及iOS程序執(zhí)行順序

最近有一個小師弟問我生命周期和程序執(zhí)行順序的問題,話不多少,這就分享一篇文章.非常詳細.

當(dāng)一個視圖控制器被創(chuàng)建,并在屏幕上顯示的時候。 代碼的執(zhí)行順序

1、 alloc ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 創(chuàng)建對象,分配空間

2、init (initWithNibName) 初始化對象,初始化數(shù)據(jù)

3、loadView ? ? ? ? ? ? ? ? ? ? ? ? ?從nib載入視圖 ,通常這一步不需要去干涉。除非你沒有使用xib文件創(chuàng)建視圖

4、viewDidLoad ? ? ? ? ? ? ? ? ? 載入完成,可以進行自定義數(shù)據(jù)以及動態(tài)創(chuàng)建其他控件

5、viewWillAppear ? ? ? ? ? ? ?視圖將出現(xiàn)在屏幕之前,馬上這個視圖就會被展現(xiàn)在屏幕上了

6、viewDidAppear ? ? ? ? ? ? ? 視圖已在屏幕上渲染完成

當(dāng)一個視圖被移除屏幕并且銷毀的時候的執(zhí)行順序,這個順序差不多和上面的相反

1、viewWillDisappear ? ? ? ? ? ?視圖將被從屏幕上移除之前執(zhí)行

2、viewDidDisappear ? ? ? ? ? ? 視圖已經(jīng)被從屏幕上移除,用戶看不到這個視圖了

3、dealloc ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 視圖被銷毀,此處需要對你在init和viewDidLoad中創(chuàng)建的對象進行釋放

關(guān)于viewDidUnload :在發(fā)生內(nèi)存警告的時候如果本視圖不是當(dāng)前屏幕上正在顯示的視圖的話, viewDidUnload將會被執(zhí)行,本視圖的所有子視圖將被銷毀,以釋放內(nèi)存,此時開發(fā)者需要手動對viewLoad、viewDidLoad中創(chuàng)建的對象釋放內(nèi)存。 因為當(dāng)這個視圖再次顯示在屏幕上的時候,viewLoad、viewDidLoad?再次被調(diào)用,以便再次構(gòu)造視圖。

當(dāng)我們創(chuàng)建一個UIViewController類的對象時,通常系統(tǒng)會生成幾個默認的方法,這些方法大多與視圖的調(diào)用有關(guān),但是在視圖調(diào)用時,這些方法的調(diào)用順序如何,需要整理下。

通常上述方法包括如下幾種,這些方法都是UIViewController類的方法:

- (void)viewDidLoad;

- (void)viewDidUnload;

- (void)viewWillAppear:(BOOL)animated;

- (void)viewDidAppear:(BOOL)animated;

- (void)viewWillDisappear:(BOOL)animated;

- (void)viewDidDisappear:(BOOL)animated;

下面介紹下APP在運行時的調(diào)用順序。

1)- (void)viewDidLoad;

一個APP在載入時會先通過調(diào)用loadView方法或者載入IB中創(chuàng)建的初始界面的方法,將視圖載入到內(nèi)存中。然后會調(diào)用viewDidLoad方法來進行進一步的設(shè)置。通常,我們對于各種初始數(shù)據(jù)的載入,初始設(shè)定等很多內(nèi)容,都會在這個方法中實現(xiàn),所以這個方法是一個很常用,很重要的方法。

但是要注意,這個方法只會在APP剛開始加載的時候調(diào)用一次,以后都不會再調(diào)用它了,所以只能用來做初始設(shè)置。

2) - (void)viewDidUnload;

在內(nèi)存足夠的情況下,軟件的視圖通常會一直保存在內(nèi)存中,但是如果內(nèi)存不夠,一些沒有正在顯示的viewcontroller就會收到內(nèi)存不夠的警告,然后就會釋放自己擁有的視圖,以達到釋放內(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),所以這個方法通常我們都需要去實現(xiàn)。

另外,即使在設(shè)備上按了Home鍵之后,系統(tǒng)也不一定會調(diào)用這個方法,因為IOS4之后,系統(tǒng)允許將APP在后臺掛起,并將其繼續(xù)滯留在內(nèi)存中,因此,viewcontroller并不會調(diào)用這個方法來清除內(nèi)存。

3)- (void)viewWillAppear:(BOOL)animated;

系統(tǒng)在載入所有數(shù)據(jù)后,將會在屏幕上顯示視圖,這時會先調(diào)用這個方法。通常我們會利用這個方法,對即將顯示的視圖做進一步的設(shè)置。例如,我們可以利用這個方法來設(shè)置設(shè)備不同方向時該如何顯示。

另外一方面,當(dāng)APP有多個視圖時,在視圖間切換時,并不會再次載入viewDidLoad方法,所以如果在調(diào)入視圖時,需要對數(shù)據(jù)做更新,就只能在這個方法內(nèi)實現(xiàn)了。所以這個方法也非常常用。

4) - (void)viewDidAppear:(BOOL)animated;

有時候,由于一些特殊的原因,我們不能在viewWillApper方法里,對視圖進行更新。那么可以重寫這個方法,在這里對正在顯示的視圖進行進一步的設(shè)置。

5) - (void)viewWillDisappear:(BOOL)animated;

在視圖變換時,當(dāng)前視圖在即將被移除、或者被覆蓋時,會調(diào)用這個方法進行一些善后的處理和設(shè)置。

由于在IOS4之后,系統(tǒng)允許將APP在后臺掛起,所以在按了Home鍵之后,系統(tǒng)并不會調(diào)用這個方法,因為就這個APP本身而言,APP顯示的view,仍是掛起時候的view,所以并不會調(diào)用這個方法。

6) - (void)viewDidDisappear:(BOOL)animated;

我們可以重寫這個方法,對已經(jīng)消失,或者被覆蓋,或者已經(jīng)隱藏了的視圖做一些其他操作。

上述方法的流程圖可以簡單用如下表示:

運行APP —> 載入視圖 —> 調(diào)用viewDidLoad方法 —> 調(diào)用viewWillAppear方法 —> 調(diào)用viewDidAppear方法?—>?? 正常運行

aaaaaaaaA????????????????????????????????????????????????????????????????????????????|

aaaaaaaa|????????????????????????????????????????????? ???????????? ??????? ??????? ? |

aaaaaaaa|?載入新的View?????????????????????????????????????????????? ?????????? |

aaaaaaaa|??????????????????????????????????????????????????????????????? ???????????? |

aaaaaaaa|????????????????????????????????????????????????????? ?????????? ?????? ??? ?V

釋放對象所有權(quán)?<—?調(diào)用viewDidUnload?<— 收到內(nèi)存警告?<—?調(diào)用viewDidDisappear?<—?調(diào)用viewWillDisappear?<—? APP需要調(diào)用另一個view

IOS程序啟動執(zhí)行順序

http://www.yifeiyang.net/iphone-developer-advanced-3-iphone-application-startup-process/

IOS?開發(fā)?loadView?和?viewDidLoad?的區(qū)別

iPhone開發(fā)必不可少的要用到這兩個方法。 他們都可以用來在視圖載入的時候,初始化一些內(nèi)容。 但是他們有什么區(qū)別呢?

viewDidLoad 此方法只有當(dāng)view從nib文件初始化的時候才被調(diào)用。

loadView 此方法在控制器的view為nil的時候被調(diào)用。 此方法用于以編程的方式創(chuàng)建view的時候用到。 如:

-(void)loadView{

UIView *view =[[UIView alloc]initWithFrame:[UIScreen

mainScreen].applicationFrame];

[view setBackgroundColor:_color];

self.view = view;

[view release];

}

你在控制器中實現(xiàn)了loadView方法,那么你可能會在應(yīng)用運行的某個時候被內(nèi)存管理控制調(diào)用。 如果設(shè)備內(nèi)存不足的時候, view 控制器會收到didReceiveMemoryWarning的消息。 默認的實現(xiàn)是檢查當(dāng)前控制器的view是否在使用。如果它的view不在當(dāng)前正在使用的view hierarchy里面,且你的控制器實現(xiàn)了loadView方法,那么這個view將被release, loadView方法將被再次調(diào)用來創(chuàng)建一個新的view。

--------------------------------------------------------------------------------------------------------------------------------------------

Don't read self.view in -loadView.Onlysetit, don'tgetit.

The self.view property accessorcalls-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=[[UIViewalloc]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.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,363評論 6 532
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,497評論 3 416
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,305評論 0 374
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,962評論 1 311
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 71,727評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,193評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,257評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,411評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,945評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 40,777評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,978評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,519評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,216評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,642評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,878評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,657評論 3 391
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 47,960評論 2 373

推薦閱讀更多精彩內(nèi)容