準備知識(來自網易博友:煙花細雨):
1、按照結構可以把ViewController分為2類:
1)主要是用于顯示内容的ViewController,這種ViewController主要是用于為使用者展示内容,并且與使用者互動,比如UITableViewCOntroller,UIVewController
2)永固控制和顯示其他ViewController的ViewController,這種ViewController一般都是一個ViewCOntroller的容器。比如UINavigationController,UITableViewCOntroller。他們都有一個屬性ViewCOntroller。其中UINavigationController表示一種stack結構,push一個ViewController或者pop一個ViewController。是以後一個ViewCOntroller就會依賴于前一個ViewController。而UITableBarCOntroller是一個Array結構,各個ViewController是并列的。第一種ViewCOntroller會經常被繼承,用來顯示不同的資料給使用者,第二種比較少,除非有需要自定義它。
2、當view被添加到其他view之前時,會調用viewWillAppear,而後會調用viewDidAppear,
當view被從其他view移除是時,會調用viewWillDisAppear,而後會調用viewDidDisAppear
當view不在被使用時,而且是disAppear,收到記憶體警告時,viewController會将view釋放掉并指向nil
3、由于viewController家在view時,會自動将一些view對象指向其對應的IBOutlet變量,是以當view被解除安裝時我們必須在viewDidUnload時将這些變量釋放掉,ViewCOntroller不會自動做這些事情,具體的是将ViewController的屬性設定為空即可。
ViewController加載過程
步驟一:
預設的執行順序是:先尋找有關Nib檔案的資訊,然後執行init初始化方法進行Controller的執行個體化,順序如下:
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle
*)nibBundleOrNil
{
self =[superinitWithNibName:nibNameOrNil
bundle:nibBundleOrNil];
if (self) {
NSLog(@"initWithNibName");
}
returnself;
}
- (id)init
self =[superinit];
NSLog(@"init");
函數用途:不要在init、initWithNibName方法内建立view的代碼。良好的設計,應該是隻有相關資料的初始化,而且這些資料都是比較關鍵的資料。init裡面不要掉self.view
,否則就會導緻Controller建立View(因為View是lazyload的)
步驟二
當View需要被展示時,但是View卻為nil,ViewController會自動調用該方法。如果不用Nib檔案,需要重載該方法實作自定義布局。
- (void)loadView;
用途:隻初始化View,一般用于建立的view如UITableView的tableView,NavigationController的navigationBar,最好也不要初始化一些非關鍵的View
思考:對于View的自定義應該在該函數寫(View還未出現)。
步驟三
當View被加載時,對于用代碼實作的ViewController,ViewDidLoad的方法在loadView之後加載,當View的屬性被設定是也會調用該方法
- (void)viewDidLoad;
用途:此時View已經有了,适合建立一個子View和控件。ViewDidLoad可能會調用多次(viewCOntroller可能會多次載入view)
思考:你可以重載該函數進一步定制View(View還未出現),或者使用- (BOOL)isViewLoaded來判斷View是否被加載完成
步驟四:
- (void)viewWillAppear:(BOOL)animated
NSLog(@"viewWillAppear");
視圖将要出現,預設不執行任何操作
用途:此時view被添加到superview之前,切換動畫之前調用。可以進行顯示前的處理,比如鍵盤彈出,一些特殊動畫(狀态條、Navigationbar的顔色)
思考:可以用來更新準備顯示視圖的資訊
步驟五:
- (void)viewWillLayoutSubviews
- (void)viewDidLayoutSubviews
步驟六:
-(void)viewDidAppear:(BOOL)animated;
View完全過渡到螢幕,預設不執行任何操作
用途:一般是顯示後,在切換動畫後,有其他的操作寫在這個函數裡面
思考1:可以用來觸發視圖完全顯示在螢幕上之後的行為,例如任何動畫的操作
思考2:和viewDidLoad的差別,viewDidLoad隻是在第一次生成并加載View的時候調用,以後都不會用到,但是viewDidAppear是每次視圖出現都被調用的。
思考3:整個加載順序:initWithNibName->init->loadView->viewDidLoad->viewWillAppear->
viewWillLayoutSubviews->viewDidLayoutSubviews->viewDidAppear
ViewController解除安裝過程:
-(void)viewWillDisappear:(BOOL)animated;
View釋放前調用該函數
步驟二:
-(void)viewDidDisappear:(BOOL)animated;
View釋放時調用該函數
步驟三:
-(void)viewWillUnload;
-(void)viewDidUnload;
系統記憶體不足時調用該方法
用途:調用viewDidUnload的時候,Viewcontroller的view已經是nil。由于一般發生記憶體警告,是以在這裡主要是釋放不再顯示的view。比如viewController的view加了一個button,而且這個button是viewcontroller的屬性,那麼你就把這個button屬性設為nil,以免占用不必要的記憶體。這個button會在viewDidLoad的時候重新被建立。
思考1:可以使用ViewDidUnload函數釋放視圖所擁有的所有資料,當然賊額資料宅視圖重新被載入記憶體時能夠很容易建立。
思考2:收到記憶體警告,不可見的Controller的View被釋放并被設定為nil
-(void)didReceiveMemoryWarning;
記憶體緊張時調用,釋放ViewDidUnLoad函數中沒有被釋放的資料
-(void)dealloc;
釋放視圖對象的引用和viewController所需的資料結構
思考:當收到記憶體警告時,記憶體中的所有UIViewCOntroller都會收到didEceive
MemoryWarning調用資訊,目的是講不可見的UIViewController中的View釋放掉,但是不調用dealloc方法,是以當該UIViewCOntroller在此顯示時又要省城一次,調用函數順序如下:
Loadview->viewDidLoad->viewWillAppear(記憶體警告被釋放的view再一次生成)