iOS開發(fā)基礎(chǔ):【從誕生到死亡】ViewController的生命周期

第一次接觸iOS的開發(fā)人員馍迄,有種強(qiáng)烈的不適感福也,這種不適感來自于在iOS系統(tǒng)里,我們的代碼不是從初始化到釋放內(nèi)存那樣按部就班的完成一系列任務(wù)攀圈,而是像個(gè)乒乓球手一樣暴凑,等待著迎接系統(tǒng)發(fā)來的“球”,接到球時(shí)赘来,我們用較短的代碼片段现喳,完成指定的任務(wù),然后就返回了犬辰,我們似乎沒有“控制權(quán)”嗦篱,我們只是在回答系統(tǒng)的一系列問題,而ViewController的這一系列問題是一組消息幌缝,這組消息告訴我們灸促,視圖將要干什么,已經(jīng)完成了什么,這與UIView形成了巨大的反差腿宰,UIView只關(guān)心“繪圖”呕诉,卻從未擔(dān)心過自己是否已經(jīng)顯示,換句話說吃度,視圖的顯示甩挫、隱藏、設(shè)置大小椿每,不是由UIView自身管理的伊者,這些任務(wù),被劃分給了ViewController间护。

初啼

一個(gè)類的生命周期亦渗,一定從 init...開始,但實(shí)際開發(fā)中汁尺,ViewController的入口幾乎99%是 viewDidLoad法精,這時(shí),初始化已經(jīng)完成痴突,UIViewController的屬性view也已經(jīng)被賦值搂蜓,如果你重寫了loadView,最后也會(huì)調(diào)用viewDidLoad辽装,因此扛点,這是個(gè)初始化子視圖的好地方雕沉,這是因?yàn)椋?/p>

  1. viewDidLoad 只會(huì)被調(diào)用一次
  2. 如果使用Autolayout恭理,這時(shí)** 子視圖的 frame 屬性還沒有被設(shè)置植影,沒有被設(shè)置,沒有被設(shè)置** 拓巧,這幾乎是你唯一設(shè)置綁定的時(shí)機(jī)(用編碼方式設(shè)置自動(dòng)布局)斯碌,另一個(gè)時(shí)機(jī)是storyboard中的手動(dòng)綁定,這當(dāng)然在viewDidLoad被調(diào)用之前玲销。

表演時(shí)刻

- (void)viewWillAppear:(BOOL)animated
viewWillAppear總是在viewDidLoad之后被調(diào)用输拇,但不是立即,當(dāng)你只是引用了屬性view贤斜,卻沒有立即把view添加到任何已經(jīng)展示的視圖上時(shí)策吠,viewWillAppear不會(huì)被調(diào)用,這在view被外部引用時(shí)瘩绒,就會(huì)發(fā)生猴抹。當(dāng)然,隨著ViewController的多次推入锁荔,多次進(jìn)入子頁面后返回蟀给,該方法會(huì)被多次調(diào)用

鎖屏之后會(huì)被調(diào)用嗎?

不會(huì)跋理。viewWillAppear關(guān)注的是view在層次中的顯示與消失择克,鎖屏并沒有改變App本身的層次。

Window疊加后前普,會(huì)被調(diào)用嗎肚邢?

不會(huì)。同鎖屏?xí)r的原因類似拭卿,疊加Window并沒有改變ViewController所在Window的視圖層次骡湖,換句話說,view并沒有被覆蓋或刪除(相對(duì)于自己所在Window)峻厚。

什么時(shí)候animated == YES响蕴?

[self.navigationController pushViewController:subVC animated:YES];
[self presentViewController:subVC animated:YES completion:nil];

視圖顯示后

- (void)viewDidAppear:(BOOL)animated 將被調(diào)用,子視圖有自定義動(dòng)畫時(shí)惠桃,建議在Did方法中啟動(dòng)浦夷,在Will中啟動(dòng)動(dòng)畫時(shí),動(dòng)畫效果將不會(huì)很理想刽射。

視圖被疊加军拟,或移除時(shí)

- viewWillDisappear:將被調(diào)用
配套的會(huì)調(diào)用- viewDidDisappear:
具體指子視圖控制器是以push和present方法顯示的,父視圖控制器的以上兩個(gè)方法會(huì)被觸發(fā)誓禁。

特別的,addSubview 會(huì)調(diào)用子控制器Appear系列方法肾档,但不會(huì)調(diào)用父視圖viewWillDisappear 方法摹恰。

如下添加子視圖:

    XSDViewController *subVC = [[XSDViewController alloc] init];
    [self addChildViewController:subVC];
    [subVC.view setFrame:self.view.frame];
    [self.view addSubview:subVC.view];
    [subVC didMoveToParentViewController:self];

得到結(jié)果是,只有 XSDViewController 的 Appear系列方法被調(diào)用怒见,這樣的調(diào)用與push/present方法根本不同是父視圖的View沒有“隱藏”俗慈,只是被覆蓋了。

這說明Appear系列方法是與當(dāng)前控制器的View的顯示/隱藏密切相關(guān)的遣耍。

viewWillAppear 與 viewDidAppear 之間發(fā)生了什么

- viewWillLayoutSubviews
- viewDidLayoutSubviews將會(huì)被調(diào)用闺阱,

而使用Autolayout時(shí),子視圖大小只有在viewDidLayoutSubviews才真正被設(shè)置好舵变,所以這里才是獲取子視圖大小的正確位置酣溃,常見的錯(cuò)誤是,在viewDidLoad中讀取了某個(gè)view.frame纪隙,用來給其它子視圖賦值赊豌,結(jié)果得到一堆大小“不定”的視圖,甚至可能為零绵咱,在視圖中看不見碘饼!

顯示時(shí)(push)調(diào)用一覽表

  1. initWithCoder:
  2. awakeFromNib
  3. willMoveToParentViewController:
  4. prefersStatusBarHidden
  5. preferredStatusBarUpdateAnimation
  6. loadView
  7. prepareForSegue:sender:
  8. viewDidLoad
  9. extendedLayoutIncludesOpaqueBars
  10. edgesForExtendedLayout
  11. viewWillAppear:
  12. extendedLayoutIncludesOpaqueBars
  13. edgesForExtendedLayout
  14. updateViewConstraints
  15. viewWillLayoutSubviews
  16. viewDidLayoutSubviews
  17. (Animation)
  18. viewDidAppear:
  19. didMoveToParentViewController:
  20. updateViewConstraints
  21. viewWillLayoutSubviews
  22. viewDidLayoutSubviews

ViewController死亡的原因

死亡不是什么問題,不死才是大問題
——《禪者的初心》

  1. 系統(tǒng)內(nèi)存不足時(shí),會(huì)收到內(nèi)存警告
    didReceiveMemoryWarning是手動(dòng)釋放內(nèi)存的機(jī)會(huì)艾恼。
  2. 調(diào)用 dismissViewControllerAnimated: completion:后住涉,viewDidDisappear被調(diào)用,最終會(huì)調(diào)用dealloc钠绍,在ARC中秆吵,這里不必要做release 的工作,卻是檢測(cè)內(nèi)存釋放的好位置五慈,如果一個(gè)控制器從屏幕上已經(jīng)推出纳寂,卻從未調(diào)用dealloc,幾乎可以判定內(nèi)存泄漏泻拦。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末毙芜,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子争拐,更是在濱河造成了極大的恐慌腋粥,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,104評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件架曹,死亡現(xiàn)場(chǎng)離奇詭異隘冲,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)绑雄,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門展辞,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人万牺,你說我怎么就攤上這事罗珍。” “怎么了脚粟?”我有些...
    開封第一講書人閱讀 168,697評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵覆旱,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我核无,道長(zhǎng)扣唱,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,836評(píng)論 1 298
  • 正文 為了忘掉前任团南,我火速辦了婚禮噪沙,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘已慢。我一直安慰自己曲聂,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,851評(píng)論 6 397
  • 文/花漫 我一把揭開白布佑惠。 她就那樣靜靜地躺著朋腋,像睡著了一般齐疙。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上旭咽,一...
    開封第一講書人閱讀 52,441評(píng)論 1 310
  • 那天贞奋,我揣著相機(jī)與錄音,去河邊找鬼穷绵。 笑死轿塔,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的仲墨。 我是一名探鬼主播勾缭,決...
    沈念sama閱讀 40,992評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼目养!你這毒婦竟也來了俩由?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,899評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤癌蚁,失蹤者是張志新(化名)和其女友劉穎幻梯,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體努释,經(jīng)...
    沈念sama閱讀 46,457評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡碘梢,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,529評(píng)論 3 341
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了伐蒂。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片煞躬。...
    茶點(diǎn)故事閱讀 40,664評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖饿自,靈堂內(nèi)的尸體忽然破棺而出汰翠,到底是詐尸還是另有隱情,我是刑警寧澤昭雌,帶...
    沈念sama閱讀 36,346評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站健田,受9級(jí)特大地震影響烛卧,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜妓局,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,025評(píng)論 3 334
  • 文/蒙蒙 一总放、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧好爬,春花似錦局雄、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蜈漓。三九已至,卻和暖如春宫盔,著一層夾襖步出監(jiān)牢的瞬間融虽,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工灼芭, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留有额,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,081評(píng)論 3 377
  • 正文 我出身青樓彼绷,卻偏偏與公主長(zhǎng)得像巍佑,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子寄悯,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,675評(píng)論 2 359

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

  • 一萤衰、 大體流程: (loadView/nib)文件來加載view到內(nèi)存-->viewDidLoad函數(shù)進(jìn)一步初始化...
    willphonez閱讀 11,236評(píng)論 2 8
  • 最近看了幾篇博客,在這里對(duì)ViewConroller的生命周期做一個(gè)總結(jié)热某,抽絲剝繭吧腻菇,感覺有道理的拿出來匯總一下 ...
    公子無禮閱讀 1,449評(píng)論 0 2
  • ViewController是IOS開發(fā)中MVC模式中的C,ViewController是view的con...
    豆瓣菜閱讀 4,133評(píng)論 0 15
  • 排序算法 定義 對(duì)一序列對(duì)象根據(jù)某個(gè)關(guān)鍵字進(jìn)行排序 評(píng)判標(biāo)準(zhǔn) 穩(wěn)定:如果a原本在b前面昔馋,而a=b筹吐,排序之后a仍然在...
    exialym閱讀 516評(píng)論 1 3
  • 文/蘭雪清風(fēng) 我是一只毛毛熊, 一只被丟棄的毛毛熊秘遏。 我一身臟污丘薛, 孤單的躺在 被烈日曬得發(fā)燙的草地上。 仰望頭頂...
    蘭雪清風(fēng)閱讀 476評(píng)論 3 0