先總的說下調(diào)用順序:
- initWithNibName
- loadView
- viewDidload
- viewWillAppear
- viewWillLayoutSubviews
- viewDidLayoutSubviews
- viewDidAppear
- viewWillDisappear
- viewDidDisappear
- dealloc
initWithNibName
- (instancetype)initWithNibName:(NSString *)nibNameOrNil
bundle:(NSBundle *)nibBundleOrNil{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
if ([self respondsToSelector:@selector(setEdgesForExtendedLayout:)]) {
self.edgesForExtendedLayout = UIRectEdgeAll;
self.extendedLayoutIncludesOpaqueBars = YES;
self.automaticallyAdjustsScrollViewInsets = NO;
} else {
self.wantsFullScreenLayout = YES;
}
}
return self;
}
}
在這個函數(shù)中應(yīng)該只有相關(guān)數(shù)據(jù)的初始化,而且這些數(shù)據(jù)都是比較關(guān)鍵的數(shù)據(jù)粒督,不要出現(xiàn)創(chuàng)建view的代碼尚辑,也不要調(diào)self.view片仿,否則會導(dǎo)致ViewController創(chuàng)建view;View的創(chuàng)建留給后面的方法。當(dāng)然,如果你是用XIB,可以用這個方法初始化xib文件喉誊。如上代碼,我設(shè)置了些參數(shù),例如* self.automaticallyAdjustsScrollViewInsets = NO;*告訴系統(tǒng)不要對我的scrollview做自適應(yīng)inset,否則VC的controller會把scrollview頂下來,造成計算偏差.
loadView
loadView 方法是查看你有木沒有 xib画髓,有的話就用 xib 加載基本信息缩举,木有的話就會創(chuàng)建一個空白的 UIView衣赶,然后把它作為這個 ViewController 的 view.所以之后我們可以在viewDidLoad中調(diào)用self.view,并進行自定義操作.一般來說,我們不去重寫這個方法,重頭戲都放在viewDidLoad中.
關(guān)于loadView,他其實是lazy load的,就是懶加載,當(dāng)顯示的調(diào)用self.view時,如果你重寫了這個方法,那么系統(tǒng)就會調(diào)用loadView,調(diào)用完后,再自動調(diào)用ViewDidLoad函數(shù).這時就有可能造成死循環(huán),這也是我們一般不去重寫loadView方法的一個原因.
viewDidLoad
這個時候,view已然加載到了內(nèi)存中,我們可以隨心所欲的添加subView,或者填充數(shù)據(jù).最好不要操作self.view诊赊。
viewWillAppear
view即將顯示,但此時其superView還為nil府瞄,即view還沒有加到任何其他view中碧磅,但準(zhǔn)備要添加到其他View中了。
在view被添加到superview之前摘能,切換動畫之前調(diào)用续崖。在這里可以進行一些顯示前的處理。比如鍵盤彈出团搞,一些特殊的過程動畫(比如狀態(tài)條和navigationbar顏色).
viewWillLayoutSubviews
官方文檔如下:
When a view’s bounds change, the view adjusts the position of its subviews. Your view controller can override this method to make changes before the view lays out its subviews. The default implementation of this method does nothing.
除了按順序調(diào)用外,當(dāng)view大小改變時,我們可以在這里調(diào)整subview的位置,大小等。不過一般來說,我們在創(chuàng)建subview時會設(shè)定其autoresizingMask多艇,由系統(tǒng)幫助我們調(diào)整,畢竟人家的方法有硬件的優(yōu)化
viewDidLayoutSubviews
view已經(jīng)布局其Subviews逻恐。比如view的bounds改變了,已經(jīng)調(diào)整Subviews的位置,在調(diào)整完成之后要做的一些工作就可以在該方法中實現(xiàn)复隆。例如可以reloadData,或者也可以做layoutSubview的工作拨匆。
viewDidAppear
view已經(jīng)顯示,即已經(jīng)加到其superView中了挽拂。view顯示后惭每,在切換動畫后,如果有需要的操作亏栈,可以在這里加入相關(guān)代碼台腥,例如reloadData。
viewWillDisappear
view即將從superView中移除绒北,此時還沒有調(diào)用removeFromeSuperView黎侈。這是可以處理一些小問題,例如顯示statusBar.修改子scrollview是否可以滑動等。
viewDidDisappear
view已經(jīng)從superView中移除了,可以恢復(fù)一些控件屬性.
dealloc
VC被釋放.
需要注意的方法
viewDidUnload(iOS3.0引入,iOS6廢棄了該方法)
viewWillUnload(iOS6廢棄了該方法)
didReceiveMemoryWarning
內(nèi)存吃緊時(系統(tǒng)發(fā)出警告或者ViewController本身調(diào)用導(dǎo)致didReceiveMemoryWarning被調(diào)用)闷游。
注意是除當(dāng)前正在展示的view 所屬 viewController 以外所有已經(jīng)在內(nèi)存里面的viewController 執(zhí)行 didReceiveMemoryWarning方法峻汉,而不是當(dāng)前viewController 執(zhí)行 didReceiveMemoryWarning。