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)造視圖。