[轉]loadView/viewDidLoad/initWithNibName/awakeFromNib/initWithCoder的用法

轉載自 http://www.devdiv.com/home.php?mod=space&uid=18486&do=blog&id=6517


每個ios開發者對loadView和viewDidLoad肯定都很熟悉,雖然這兩個函數使用上真的是非常簡單,但是和類似的initWithNibName/awakeFromNib/initWithCoder放在一起還是非常容易讓人混淆的. 

昨天看了下蘋果官方的相關文檔以及幾篇相關內容的網頁(一 二 三),其實這個內容以前也看過,似乎也搞清楚了,可還是忘了.好急性不如爛筆頭,這次一定要好好記下來. 

大前提是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 方法 


運行順序:本人已試過: 
viewDidLoad ->awakeFromNib ->viewWillAppear

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章