UIViewController的生命周期

UIViewController是IOS程序中的一個重要組成部分,扮演者一個大管家的身份祝辣,管理著程序中的眾多視圖:

何時加載view,加載的原則是什么执泰,視圖何時消失等問題品抽,文檔中講的都很詳細泻云。

Controller的view最好在需要顯示時再去加載固该,并且在系統(tǒng)發(fā)出內(nèi)存警告時釋放不必要的view及相關(guān)的可再生的數(shù)據(jù)對象握础。

一点楼、UIViewController的初始化

初始化時會根據(jù)需要調(diào)用init扫尖,initWithCoder等相關(guān)函數(shù),這個時候我們可以 做一下簡單的初始化操作掠廓,建立ViewController中需要使用的數(shù)據(jù)模型等换怖,不建議在初始化階段就直接創(chuàng)建view及其他與顯示有關(guān)的對象(應該 放到loadView的時候去創(chuàng)建,或者采用懶加載的方法創(chuàng)建)蟀瞧。

我們都知道ViewController可以通過代碼和xib兩種方式創(chuàng)建沉颂,這兩種方式的初始化流程也不盡相同。

1)使用xib創(chuàng)建的VC

xib其實最終是會把我們的設(shè)置保存成一個數(shù)據(jù)集(xml文件)悦污, 當需要初始化構(gòu)建VC的時候铸屉,回去讀取記錄的數(shù)據(jù)集,然后幫我們動態(tài)的創(chuàng)建VC切端,因此可以想象它在初始化時會先去找看是否實現(xiàn)initWithCoder 方法彻坛,如果該類實現(xiàn)了該方法,就直接調(diào)用initWithCoder方法創(chuàng)建對象踏枣,如果沒有實現(xiàn)的話就調(diào)用init方法昌屉。調(diào)用完初始化方法以后緊接著會調(diào) 用awakeFromNib方法,在這個方法里面我們可以做進一步的初始化操作茵瀑。

2)使用代碼創(chuàng)建VC

使用代碼創(chuàng)建時间驮,我們根據(jù)需要手動的創(chuàng)建VC中的數(shù)據(jù),如果自己定制VC時瘾婿,還需要在init中調(diào)用[super init]蜻牢。

二烤咧、UIViewController中View的load和unload

前面講了不建議在VC初始化的時候就創(chuàng)建view及其他與顯示相關(guān)的代碼偏陪,官方文檔建議將 View的初始化操作放到loadView的時候再做,當VC接到內(nèi)存告警時會調(diào)用didRecieveMemoryWarning這個時候我們就要做出 響應煮嫌,釋放暫時不需要的對象笛谦。如果無視這個警告,系統(tǒng)內(nèi)存不夠用時會會繼續(xù)發(fā)送昌阿,如果還得不到處理就會強制退出程序饥脑。下面看具體的loadView和 unloadView時候都會做什么操作恳邀。

1)Load周期

load cycle

當需要顯示或者訪問view屬性時,view沒有創(chuàng)建的話灶轰,VC就會調(diào)用loadView方 法谣沸,在這個時候會創(chuàng)建一個view并將其賦給VC.view屬性。緊接著就會調(diào)用VC的viewDidLoad方法笋颤,這個時候VC.view保證是有值 的乳附,可以做進一步的初始化操作,例如添加一些subview伴澄。注意:定制VC時赋除,如果覆蓋loadView方法,不需要調(diào)用[super loadView]方法非凌。

2)Unload周期

當app收到內(nèi)存警告的時候举农,會調(diào)用每一個VC的didRecieveMemoryWarning方法,我們需要做出響應敞嗡,釋放程序中暫時不需要的資源颁糟。通常都會重寫該方法,重寫時候需要調(diào)用super的該方法秸妥。如果檢測到當前VC的view可以被安全釋放的話滚停,就會調(diào)用viewWillUnload方法,這個我們必須要重視粥惧,因為當VC的view消失時候它的subviews可能會被一起釋放键畴,我們需要根據(jù)具體情況做一些記錄,以保證下次能夠正確創(chuàng)建突雪,同時不出現(xiàn)內(nèi)存泄漏起惕。調(diào)用viewWillUnload以后,會將VC.view屬性設(shè)置成nil咏删,然后在調(diào)用viewDidUnload方法惹想,這個時候我們可以釋放那些強引用的對象。

三 督函、ViewController的生命周期

View是指Controller的View嘀粱。它作為Controler的屬性,生命周期在Controller的生命周期內(nèi)辰狡。就是說你的Controller不能在view釋放前就釋放了锋叨。

viewController的生命周期圖

UIViewController的生命周期

需要說明的是:當你alloc并init了一個ViewController時,這個ViewController應該是還沒有創(chuàng)建view的宛篇。 ViewController的view是使用了lazyInit方式創(chuàng)建娃磺,就是說你調(diào)用的view屬性的getter:[self view]。在getter里會先判斷view是否創(chuàng)建叫倍,如果沒有創(chuàng)建偷卧,那么會調(diào)用loadView來創(chuàng)建view豺瘤。loadView完成時會繼續(xù)調(diào)用 viewDidLoad。loadView和viewDidLoad的一個區(qū)別就是:loadView時還沒有view听诸。而viewDidLoad時 view以及創(chuàng)建好了坐求。

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

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

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

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

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

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

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

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

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

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

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

關(guān) 于viewDidUnload :在發(fā)生內(nèi)存警告的時候如果本視圖不是當前屏幕上正在顯示的視圖的話, viewDidUnload將會被執(zhí)行讼油,本所有子視圖將被銷毀杰赛,以釋放內(nèi)存。 因此當這個視圖再次顯示在屏幕上的時候矮台,viewDidLoad 再次被調(diào)用乏屯,以構(gòu)造視圖。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末瘦赫,一起剝皮案震驚了整個濱河市辰晕,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌耸彪,老刑警劉巖伞芹,帶你破解...
    沈念sama閱讀 216,692評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件忘苛,死亡現(xiàn)場離奇詭異蝉娜,居然都是意外死亡唱较,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,482評論 3 392
  • 文/潘曉璐 我一進店門召川,熙熙樓的掌柜王于貴愁眉苦臉地迎上來南缓,“玉大人,你說我怎么就攤上這事荧呐『盒危” “怎么了?”我有些...
    開封第一講書人閱讀 162,995評論 0 353
  • 文/不壞的土叔 我叫張陵倍阐,是天一觀的道長概疆。 經(jīng)常有香客問我,道長峰搪,這世上最難降的妖魔是什么岔冀? 我笑而不...
    開封第一講書人閱讀 58,223評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮概耻,結(jié)果婚禮上使套,老公的妹妹穿的比我還像新娘。我一直安慰自己鞠柄,他們只是感情好侦高,可當我...
    茶點故事閱讀 67,245評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著厌杜,像睡著了一般奉呛。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上夯尽,一...
    開封第一講書人閱讀 51,208評論 1 299
  • 那天侧馅,我揣著相機與錄音,去河邊找鬼呐萌。 笑死馁痴,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的肺孤。 我是一名探鬼主播罗晕,決...
    沈念sama閱讀 40,091評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼赠堵!你這毒婦竟也來了小渊?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,929評論 0 274
  • 序言:老撾萬榮一對情侶失蹤茫叭,失蹤者是張志新(化名)和其女友劉穎酬屉,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,346評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡呐萨,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,570評論 2 333
  • 正文 我和宋清朗相戀三年杀饵,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片谬擦。...
    茶點故事閱讀 39,739評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡切距,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出惨远,到底是詐尸還是另有隱情谜悟,我是刑警寧澤,帶...
    沈念sama閱讀 35,437評論 5 344
  • 正文 年R本政府宣布北秽,位于F島的核電站葡幸,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏贺氓。R本人自食惡果不足惜礼患,卻給世界環(huán)境...
    茶點故事閱讀 41,037評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望掠归。 院中可真熱鬧缅叠,春花似錦、人聲如沸虏冻。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,677評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽厨相。三九已至领曼,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間蛮穿,已是汗流浹背庶骄。 一陣腳步聲響...
    開封第一講書人閱讀 32,833評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留践磅,地道東北人单刁。 一個月前我還...
    沈念sama閱讀 47,760評論 2 369
  • 正文 我出身青樓,卻偏偏與公主長得像府适,于是被迫代替她去往敵國和親羔飞。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,647評論 2 354

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