loadView 和 viewDidLoad

 loadView 和 viewDidLoad 是 iPhone 開發中肯定要用到的兩個方法。 他們都可以用來在視圖載入的時候初始化一些內容。 但是他們有什麼區別呢? viewDidLoad 方法只有當 view 從 nib 文件初始化的

    loadView 和 viewDidLoad 是 iPhone 開發中肯定要用到的兩個方法。 他們都可以用來在視圖載入的時候初始化一些內容。 但是他們有什麼區別呢?

    viewDidLoad 方法只有當 view 從 nib 文件初始化的時候才被調用。viewDidLoad 用於初始化,加載時用到。

    loadView 方法在控制器的 view 爲 nil 的時候被調用。 此方法用於以編程的方式創建 view 的時候用到。loadView 是使用代碼生成視圖的時候,當視圖第一次載入的時候調用的方法。用於使用(寫)代碼來實現控件。用於使用代碼生成控件的函數。如:

- ( void ) loadView {
    UIView *view = [ [ UIView alloc] initWithFrame:[ UIScreen
mainScreen] .applicationFrame] ;
[ view setBackgroundColor:_color] ;
    self.view = view;
[ view release] ;
}

    你在控制器中實現了 loadView 方法,那麼你可能會在應用運行的某個時候被內存管理控制調用。 如果設備內存不足的時候, view 控制器會收到 didReceiveMemoryWarning 的消息。 默認的實現是檢查當前控制器的 view 是否在使用。 如果它的 view 不在當前正在使用的 view hierarchy 裏面,且你的控制器實現了 loadView 方法,那麼這個 view 將被 release, loadView 方法將被再次調用來創建一個新的 view。

由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還是繼續做它該做的事情

每個ios開發者對loadViewviewDidLoad肯定都很熟悉,雖然這兩個函數使用上真的是非常簡單,但是和類似的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 方法。

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