8. UIViewController

1. UIViewController 的認識

UIViewController在iOS開發中佔據很重要的位置,iOS的整個UI開發的核心思想也是MVC的架構,從UIViewController的命名就能夠看出它在MVC中所扮演的角色,那就是Controller。Controller做爲整個UI視圖的控制器,對於用戶的輸入作出邏輯處理。也就是說咱們整個app的運做是經過UIViewController來完成的,它的UIKit框架裏是這樣的java

 2. UIViewController 的使用

UIViewController的加載有兩種方式:第一種是經過手動加載xib文件來加載視圖,第二種是直接經過代碼來建立ViewController來加載。第一種建立方式,首先要新建一個xib文件和關聯的.h 和 .m 文件,而後經過下面這個代碼來獲取到這個視圖控制器顯示在手機屏幕上數據庫

MCJViewController *MCJVC=[[MCJViewController alloc]initWithNibName:@"MCJViewController" bundle:nil];

第二種建立方式,直接經過代碼來建立網絡

MViewController *MVC=[[MViewController alloc]init];架構

3. UIViewController的生命週期

 

 

4. 拓展 loadView   viewDidLoad  viewDidUnload 的區別

UIViewController的方法,跟UIViewController的view屬性的生命週期息息相關。接下來我會一一闡述它們的做用以及它們之間的聯繫。app

loadView 1.何時被調用?框架

每次訪問UIViewController的view(好比controller.view、self.view)並且view爲nil,loadView方法就會被調用。ide

2.有什麼做用?spa

loadView方法是用來負責建立UIViewController的view 設計

3.默認實現是怎樣的?code

默認實現即[super loadView]裏面作了什麼事情。

1> 它會先去查找與UIViewController相關聯的xib文件,經過加載xib文件來建立UIViewController的view,若是在初始化UIViewController指定了xib文件名,就會根據傳入的xib文件名加載對應的xib文件
[[MViewController alloc] initWithNibName:@"MViewController" bundle:nil];  , 若是沒有明顯地傳xib文件名,就會加載跟UIViewController同名的xib文

例如: [[MViewController alloc] init]; // 加載MViewController.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的view能夠經過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]; 

 

  viewDidUnload 1.何時被調用?

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,將view賦值爲nil,而且調用viewDidUnload方法 4.當再次訪問UIViewController的view時,view已經在3中被賦值爲nil,因此又會調用loadView方法從新建立view 5.view被從新建立完畢後,仍是會調用viewDidLoad方法進行界面元素的初始

相關文章
相關標籤/搜索