日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

loadView与viewDidLoad不同

發布時間:2023/12/15 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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開發者對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

?

轉載于:https://blog.51cto.com/davychen/653001

總結

以上是生活随笔為你收集整理的loadView与viewDidLoad不同的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。