iOS開發(fā) 之 UIViewController的生命周期

本文的Demo工程代碼參考這里的StudyUIViewAndUIVC

目錄

加載

加載的完整過程: 初始化 -> loadView -> viewDidLoad -> viewWillAppear -> viewWillLayoutSubviews -> viewDidLayoutSubviews -> viewDidAppear

初始化

  • 原型

UIViewController初始化有以下三個方法

- (id)init;

- (instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil;

- (instancetype)initWithCoder:(NSCoder *)aDecode;
  • 觸發(fā)

當(dāng)通過init或new方法創(chuàng)建UIViewController對象時, 會依次調(diào)用

init -> initWithNibName:bundle:

當(dāng)通過storyboard直接由系統(tǒng)創(chuàng)建UIViewController對象時, 會調(diào)用

initWithCoder:

關(guān)于初始化更準(zhǔn)確的原文描述請參考Apple Developer API Reference

loadView

  • 原型
- (void)loadView;
  • 觸發(fā)

The view controller calls this method when its view property is requested but is currently nil

  • 備注
1: 不要直接調(diào)用該方法!!!

2: 如果使用代碼維護(hù)views, 必須重寫該方法;  如果使用Interface Builder維護(hù)views, 不能重寫該方法

viewDidLoad

  • 原型
- (void)viewDidLoad;
  • 觸發(fā)

This method is called after the view controller has loaded its view hierarchy into memory

viewWillAppear

  • 原型
- (void)viewWillAppear:(BOOL)animated;
  • 觸發(fā)

This method is called before the view controller'??s view is about to be added to a view hierarchy and before any animations are configured for showing the view

viewWillLayoutSubviews

  • 原型
- (void)viewWillLayoutSubviews;
  • 觸發(fā)

This method is called every time the frame changes like for example when rotate or it’s marked as needing layout

viewDidLayoutSubviews

  • 原型
- (void)viewDidLayoutSubviews;
  • 觸發(fā)

When the bounds change for a view controller'??s view, the view adjusts the positions of its subviews and then the system calls this method

viewDidAppear

  • 原型
- (void)viewDidAppear:(BOOL)animated;
  • 觸發(fā)

This method is executed after the animation displaying the view finishes so in this step the view is already visible for the user

  • 備注
1: 在該方法適合做這些操作: 獲取數(shù)據(jù)(從數(shù)據(jù)存儲或網(wǎng)絡(luò))并顯示到view

卸載

卸載的完整過程: viewWillDisappear -> viewDidDisappear -> dealloc

viewWillDisappear

  • 原型
- (void)viewWillDisappear:(BOOL)animated;
  • 觸發(fā)

This method is called before the view is actually removed and before any animations are configured

viewDidDisappear

  • 原型
- (void)viewDidDisappear:(BOOL)animated;
  • 觸發(fā)

You can override this method to perform additional tasks associated with dismissing or hiding the view

dealloc

  • 原型
- (void)dealloc;
  • 觸發(fā)

在沒有內(nèi)存泄漏的情況下, dealloc是肯定會被調(diào)用的, 即使延遲釋放(例如autoreleasepool)情況下, 肯定也是會被調(diào)用的

所以很多內(nèi)存泄漏檢測工具就是基于此, 例如MLeaksFinder

  • 備注
1: You override this method to dispose of resources other than the object’s instance variables

答疑

構(gòu)建view hierarchy要放在加載時的哪個方法中?

  • 盡可能地使用Interface Builder維護(hù)views

  • 如果必須使用代碼, 理論上需要放在loadView中, 但是因為

加載時的viewDidLoad方法中適合做什么操作?

  • viewDidLoad適合做與UI無關(guān)的數(shù)據(jù)和模型的操作

  • 切記不要在viewDidLoad做view hierarchy和布局的操作

sub views布局要放在加載時的哪個方法中?

  • 非autolayout的布局必須要放到viewWillLayoutSubviews

  • viewDidLoad中只確定了view的bounds, 而沒有確定orientation; viewWillLayoutSubviews中才真正確定了view的布局

哪些方法需要調(diào)用父類的方法?

  • 這些方法必須調(diào)用父類的方法([super xyz]): viewWillAppear / viewDidAppear; viewDidDisappear / viewDidDisappear

  • 如果父類是UIViewController, viewDidLoad方法可以不必調(diào)用父類的方法; 如果父類是自定義類, 根據(jù)實際情況決定是否要調(diào)用

關(guān)于是否需要調(diào)用父類方法更準(zhǔn)確的原文描述請參考Apple Developer API Reference的各接口說明

參考

更多文章, 請支持我的個人博客

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末罐盔,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子救崔,更是在濱河造成了極大的恐慌惶看,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件六孵,死亡現(xiàn)場離奇詭異纬黎,居然都是意外死亡,警方通過查閱死者的電腦和手機劫窒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進(jìn)店門本今,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人主巍,你說我怎么就攤上這事冠息。” “怎么了孕索?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵铐达,是天一觀的道長。 經(jīng)常有香客問我檬果,道長瓮孙,這世上最難降的妖魔是什么唐断? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮杭抠,結(jié)果婚禮上脸甘,老公的妹妹穿的比我還像新娘。我一直安慰自己偏灿,他們只是感情好丹诀,可當(dāng)我...
    茶點故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著翁垂,像睡著了一般铆遭。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上沿猜,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天枚荣,我揣著相機與錄音,去河邊找鬼啼肩。 笑死橄妆,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的祈坠。 我是一名探鬼主播害碾,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼赦拘!你這毒婦竟也來了慌随?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤躺同,失蹤者是張志新(化名)和其女友劉穎儒陨,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體笋籽,經(jīng)...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡蹦漠,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了车海。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片笛园。...
    茶點故事閱讀 40,040評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖侍芝,靈堂內(nèi)的尸體忽然破棺而出研铆,到底是詐尸還是另有隱情,我是刑警寧澤州叠,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布棵红,位于F島的核電站,受9級特大地震影響咧栗,放射性物質(zhì)發(fā)生泄漏逆甜。R本人自食惡果不足惜虱肄,卻給世界環(huán)境...
    茶點故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望交煞。 院中可真熱鬧咏窿,春花似錦、人聲如沸素征。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽御毅。三九已至根欧,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間端蛆,已是汗流浹背凤粗。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留欺税,地道東北人侈沪。 一個月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓揭璃,卻偏偏與公主長得像晚凿,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子瘦馍,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,979評論 2 355

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

  • /* UIViewController is a generic controller base class th...
    DanDanC閱讀 1,814評論 0 2
  • 轉(zhuǎn)至元數(shù)據(jù)結(jié)尾創(chuàng)建: 董瀟偉歼秽,最新修改于: 十二月 23, 2016 轉(zhuǎn)至元數(shù)據(jù)起始第一章:isa和Class一....
    40c0490e5268閱讀 1,719評論 0 9
  • 陳春花的書,我將一直保持閱讀情组。 看的書本的題目很自然會想到燥筷,《高效能人士的七個習(xí)慣》這本經(jīng)管類暢銷書。確實院崇,陳老師...
    雕刻時光的貓閱讀 5,007評論 0 2
  • (45)屠格涅夫筆下的《初戀》 讀完屠格涅夫的《初戀》肆氓,我是有些悲傷的。 小說以第一人稱敘述了一個關(guān)于少年初戀的故...
    荏苒幾盈虛閱讀 637評論 0 0
  • 突然很難過底瓣,眼淚在眼眶中打轉(zhuǎn)谢揪,下一秒就要流下。在微博中拼命留言轉(zhuǎn)發(fā)捐凭,在空間里沒命刷新拨扶,在簡書里翻來覆去,在游戲里跌...
    洛可可1776閱讀 352評論 0 2