提到iOS中VC的生命周期,首先想到的無外乎viewDidLoad、viewWillAppear等方法的調(diào)用執(zhí)行順序等,當(dāng)我仔細(xì)想了想,這并不是問出這個問題的人真正想要的答案,于是有了這篇思考總結(jié)VC生命周期的文章。
從UIViewController說起
官方文檔對VC的一句話解釋是:管理你的應(yīng)用程序視圖的基礎(chǔ)框架。
UIViewController的生命周期
- (instancetype)init;??
// initWithNibName 、instantiateViewController(withIdentifier:)(UIStoryboard)
alloc申請內(nèi)存創(chuàng)建對象后,你可以從storyboard、nib、或者直接init進(jìn)行初始化。(注:initWithNibName是加載帶有xib的控制器,而loadNibNamed是加載一個UIView。)
- (void)loadView; ? //- (void)loadViewIfNeeded ?NS_AVAILABLE_IOS(9_0);
當(dāng)VC初始化完成view將要被展示但為nil時,它會主動調(diào)用loadView方法創(chuàng)建或?qū)ふ襐C的root view(若是使用的xib或sb,loadView會從中加載rootview和其他子view),此時,你可以重寫loadView:
[super loadView]; 加上這句,view會按照自己的規(guī)則加載,你可以在view加載后對其進(jìn)行屬性修改;若不調(diào)用super方法,則需要你手動初始化view,給self.view賦值需求的view如webView、imageView等以便節(jié)約內(nèi)存,而這也是我們重寫loadView方法的初衷。
注:重寫loadView時不調(diào)用super直接self.view會造成死循環(huán)。
- (void)viewDidLoad;
VC加載root view到內(nèi)存中后,將執(zhí)行此方法,一般我們重寫它以便加載額外的初始化視圖或者一些必要的初始化數(shù)據(jù)處理。
- (void)viewWillAppear:(BOOL)animated;
root view加載到內(nèi)存中后,在添加到window視圖結(jié)構(gòu)層次中之前調(diào)用。即,view將要顯示??稍诖颂幪幚硪恍┤鐮顟B(tài)欄、標(biāo)題欄顏色、鍵盤彈出等特殊變化的邏輯。
對于后面的viewDidAppear、viewWillDisappear、viewDidDisappear等就不再贅述,viewWillUnload是非ARC時代的產(chǎn)物,現(xiàn)已遭廢棄。最后的dealloc也比較常用,可以監(jiān)測VC有沒有正常釋放,是解決內(nèi)存泄露的重要指標(biāo)。
注:可利用運(yùn)行時的class_replaceMethod/method_exchangeImplementations進(jìn)行統(tǒng)一VC正常釋放的統(tǒng)一打印。
至此,關(guān)于UIViewController的生命周期問題就總結(jié)思考完畢了。最后補(bǔ)個圖。
