你好,歡迎來到IOS教程網

 Ios教程網 >> IOS訊息 >> 關於IOS >> loadView/viewDidLoad/initWithNibName/awakeFromNib/initWithCoder的用法

loadView/viewDidLoad/initWithNibName/awakeFromNib/initWithCoder的用法

編輯:關於IOS

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

大前提是UIViewController有一個UIView.同時,需要理清兩個概念,
一、實例化一個類.

二、創建一個類。

在XCode中創建一個類和實例化一個類很容 易區分,但是在IB(Interface Builder)中有時候就會迷糊.其實也很好區分,孤零零地創建了一個nib文件,沒有和其他可被實例化的類有直接或間接關系的時候,這個類或這些類 (一個nib文件俺也可能包含多個類)是沒有機會被實例化的,所以這種情況只是通過ib創建了一個類,而沒有實例化.真正的實例化還需要通過在Xcode 用代碼來讀取這個nib文件.知道這兩這的區別後這些方法也就容易辨認多了。(鬼話看不懂)

viewDidLoad其實沒什麼可混淆的,無論通過什麼途徑加載(Xcode或者IB,這裡的加載屬於實例化)完view後肯定會執行這個方法.(加載ib之後調用)

loadView需要分兩種情況.當你通過Xcode實例化一個類的時候就需要自己在controller中實現這個方法.而在IB中實例化就不需要實現它.

initWithNibName這個方法是在controller的類中,在IB中創建nib文件,但是通過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 方法。


init/loadView/viewDidLoad/viewDidUnload   
這麼細節的東西想來大家都不在意,平時也不會去關系,但是在面試時卻常常被提到,所以了解viewController的生命周期還是很有必要的。由init、loadView、viewDidLoad、viewDidUnload、dealloc的關系說起
init方法
在init方法中實例化必要的對象(遵從LazyLoad思想)
?init方法中初始化ViewController本身
loadView方法
當view需要被展示而它卻是nil時,viewController會調用該方法。不要直接調用該方法。
如果手工維護views,必須重載重寫該方法
如果使用IB維護views,必須不能重載重寫該方法
loadView和IB構建view
你在控制器中實現了loadView方法,那麼你可能會在應用運行的某個時候被內存管理控制調用。 如果設備內存不足的時候, view 控制器會收到didReceiveMemoryWarning的消息。 默認的實現是檢查當前控制器的view是否在使用。 如果它的view不在當前正在使用的view hierarchy裡面,且你的控制器實現了loadView方法,那麼這個view將被release, loadView方法將被再次調用來創建一個新的view。

viewDidLoad方法
viewDidLoad 此方法只有當view從nib文件初始化的時候才被調用。

重載重寫該方法以進一步定制view
在iPhone OS 3.0及之後的版本中,還應該重載重寫viewDidUnload來釋放對view的任何索引
viewDidLoad後調用數據Model
?
viewDidUnload方法?
當系統內存吃緊的時候會調用該方法(注:viewController沒有被dealloc)
內存吃緊時,在iPhone OS 3.0之前didReceiveMemoryWarning是釋放無用內存的唯一方式,但是OS 3.0及以後viewDidUnload方法是更好的方式
在該方法中將所有IBOutlet(無論是property還是實例變量)置為nil(系統release view時已經將其release掉了)
在該方法中釋放其他與view有關的對象、其他在運行時創建(但非系統必須)的對象、在viewDidLoad中被創建的對象、緩存數據等 release對象後,將對象置為nil(IBOutlet只需要將其置為nil,系統release view時已經將其release掉了)
一般認為viewDidUnload是viewDidLoad的鏡像,因為當view被重新請求時,viewDidLoad還會重新被執行
viewDidUnload中被release的對象必須是很容易被重新創建的對象(比如在viewDidLoad或其他方法中創建的對象),不要release用戶數據或其他很難被重新創建的對象
dealloc方法
viewDidUnload和dealloc方法沒有關聯,dealloc還是繼續做它該做的事情

  1. 上一頁:
  2. 下一頁:
蘋果刷機越獄教程| IOS教程問題解答| IOS技巧綜合| IOS7技巧| IOS8教程
Copyright © Ios教程網 All Rights Reserved