每一個ios開發者對loadView和viewDidLoad確定都很熟悉,雖然這兩個函數使用上真的是很是簡單,可是和相似的initWithNibName/awakeFromNib/initWithCoder放在一塊兒仍是很是容易讓人混淆的.ios
昨天看了下蘋果官方的相關文檔以及幾篇相關內容的網頁(一 二 三),其實這個內容之前也看過,彷佛也搞清楚了,可仍是忘了.好急性不如爛筆頭,此次必定要好好記下來.
大前提是UIViewController有一個UIView.同時,須要釐清兩個概念,建立一個類和實例化一個類.在XCode中建立一個類和實例化一個類很容易區分,可是在IB(Interface Builder)中有時候就會迷糊.其實也很好區分,孤零零地建立了一個nib文件,沒有和其餘可被實例化的類有直接或間接關係的時候,這個類或這些類(一個nib文件俺也可能包含多個類)是沒有機會被實例化的,因此這種狀況只是經過ib建立了一個類,而沒有實例化.真正的實例化還須要經過在Xcode用代碼來讀取這個nib文件.知道這兩這的區別後這些方法也就容易辨認多了
viewDidLoad其實沒什麼可混淆的,不管經過什麼途徑加載(Xcode或者IB,這裏的加載屬於實例化)完view後確定會執行這個方法.
loadView須要分兩種狀況.當你經過Xcode實例化一個類的時候就須要本身在controller中實現這個方法.而在IB中實例化就不須要實現它.
initWithNibName這個方法是在controller的類在IB中建立,可是經過Xcode實例化controller的時候用的.
awakeFromNib這個方法是一個類在IB中被實例化是被調用的.看了帖子發現你們都推薦使用viewDidLoad而不要使用 awakeFromNib,應爲viewDidLoad會被屢次調用,而awakeFromNib只會當從nib文件中unarchive的時候纔會被調 用一次.實際測試中發現,當一個類的awakeFromNib被調用的時候,那麼這個類的viewDidLoad就不會被調用了,這個感受很奇怪.
initWithCoder是一個類在IB中建立但在xocdde中被實例化時被調用的.好比,經過IB建立一個controller的nib文件,而後在xocde中經過initWithNibName來實例化這個controller,那麼這個controller的initWithCoder會被調用. 若是你的對象是UIViewControler的子類,那麼你必須調用- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle*)nibBundleOrNil;方法去調用NIB文件初始化自身,即便那沒有使用nib文件也會調用這個函數(默認 狀況下init方法已經爲你的作這件事情了),若是你調用這個方法,並傳遞的兩個參數爲空(nil),而後類會調用-loadView去讀取一個名字和你 的UIViewController名字相同的nib文件,來初始化自身。若是沒有這樣的nib文件,你必須調用-setView:來設置一個 self.view。或者重載-loadView 方法。