loadView的使用總結,loadView使用總結
一、loadView 1. loadView什麼時候被調用?
每次訪問UIViewController的view(如 controller.view、self.view)並且view為nil,loadView方法就會被調用
2. 有什麼作用
loadView 方法是用來負責建立UIViewController的view
3. 預設實現是怎樣的?
預設實現即[super loadView]裡面做了好多事情:
1> 它會先去尋找與UIViewController相關聯的xib檔案,通過載入xib檔案來建立UIViewController的view
* 如果在初始化UIViewController指定了xib檔案名稱,就會根據傳入的xib檔案名稱載入對應的xib檔案 [[MJViewController alloc] initWithNibName:@"MJViewController" bundle:nil]; * 如果沒有明顯地傳xib檔案名稱,就會載入跟UIViewController同名的xib檔案 [[MJViewController alloc] init]; // 載入MJViewController.xib 2> 如果沒有找到相關聯的xib檔案,就會建立一個空白的UIView,然後賦值給UIViewController的view屬性,大致如下 self.view = [[[UIView alloc] initWithFrame: [UIScreen mainScreen].applicationFrame] autorelease]; // applicationFrame的值是:{{x = 0, y = 20}, {width = 320, height = 460}} [super loadView]裡面就大致完成1>和2>中敘述的內容4.如何正確使用這個方法?
UIViewController 可以通過xib檔案來建立,但在某些情況下,xib不是那麼靈活,所有我們有些時候想通過代碼來建立UIView
比如: self.view = [[[UIWebView alloc] initWithFrame:[UIScreen mainScreen].applicationFrame] autorelease];
如果想通過代碼來建立UIViewController的view,就要重寫loadView方法,並且不需要調用[super loadView],第三點已經提到若沒有xib檔案,
[super loadView]預設建立一個空白的UIView。我們既然要通過代碼來自訂UIVIew,那麼就沒必要事先建立一個空白的UIView,以節省不必要的開銷,正確的做法應該是這樣的:
- (void)loadView {
self.view = [[[UIWebView alloc] initWithFrame:[UIScreen mainScreen].applicationFrame] autorelease]; } 不需要調用[super loadView],即使調用了也不會出錯,只是造成了一些不必要的開銷。總而言之,蘋果設計這個方法是給我們自訂UIViewController的view用的
二、viewDidLoad
1. 什麼時候被調用?
無論是通過xib檔案還是重寫loadView 方法建立的UIViewController的view,在view建立完畢後,最終都會調用viewDidLoad方法的。
2. 有什麼作用?
一般會在這裡做介面上的初始化的操作,比如往view中添加一些子視圖、從資料庫或者網路載入模型資料裝配到子視圖中。
例如:
- (void)viewDidLoad {
[super viewDidLoad]; //添加一個按鈕 UIButton *button = [UIButton buttonWithType:UIButtonTypeContactAdd]; [button addTarget:self action:@selector(click) forControlEvents:UIControlEventTouchUpInside]; [self.view addSubview:button]; } 三、viewDidUnload1.什麼時候被調用? iOS裝置的記憶體是極其有限的,如果應用程式佔用的記憶體過多的話,系統就會對應用程式發出記憶體警告。UIViewController就會收到didReceiveMemoryWarning訊息。 didReceiveMemoryWarning方法的預設實現是:如果當前UIViewController的view不在應用程式的視圖階層(View Hierarchy)中,即view的superview為nil的時候,就會將view釋放,並且調用viewDidUnload方法 2.有什麼作用? 上面說到,發出記憶體警告且view被釋放的時候就會調用viewDidUnload方法,所以一般在釋放資源,主要是釋放介面元素相關的資源,將相關的執行個體都賦值為nil - (void)viewDidUnload { [super viewDidUnload]; self.name = nil; self.pwd = nil; }3.dealloc也是用來釋放資源的,那跟viewDidUnload有什麼關係? 當發出記憶體警告調用viewDidUnload方法時,只是釋放了view,並沒有釋放UIViewController,所以並不會調用dealloc方法。即viewDidUnload和dealloc方法並沒有任何關係,dealloc方法只會在UIViewController被釋放的時候調用
四、三個方法的關係
1. 第一次訪問UIViewController的view時,view為nil,然後 機會調用loadview方法來建立view
2. view建立完畢後調用viewDidLoad方法進行介面元素的初始化
3. 當記憶體警告時,系統可能會釋放UIViewController,將view賦值為nil,並且調用viewDidUnload方法
4. 當再次訪問UIViewController的view時,view已經在3中被賦值為nil,所以又要調用loadview方法重新建立view
5. view被重新建立完畢後,還會調用viewDidLoad 方法進行元素的初始化