1. 程式人生 > >26.ViewController的生命週期及其方法介紹

26.ViewController的生命週期及其方法介紹

ViewController

ViewController是IOS開發中MVC模式中的C,ViewController是view的controller,ViewController的職責主要包括管理內部各個view的載入顯示和解除安裝,同時負責與其他ViewController的通訊和協調。

分類

在IOS中,有兩類ViewController,一類是顯示內容的,比如UIViewController、UITableViewController等,同時還可以自定義繼承自UIViewController的ViewController;另一類是ViewController容器,UINavigationViewController和UITabBarController等,UINavigationController是以Stack的形式來儲存和管理ViewController,UITabBarController是以Array的形式來管理ViewController。

載入過程

這裡寫圖片描述

可以看到,在Controller中建立View有2種方法,一種是使用Storyboard等視覺化工具,另一種是通過程式碼建立。

ViewController生命週期

alloc -> initWithNibName -> loadView -> viewDidLoad -> viewWillAppear -> viewDidAppear -> viewWillDisappear -> viewDidDisappear -> dealloc

注意viewWillUnload和viewDidUnload已經在ios6被廢棄了,因為Clearing references to views is no longer necessary。
注意1.沒有viewWillLoad。
注意2.viewDidLoad和viewDidUnload並不是成對的。

程式執行中按下Home鍵,程式並沒有以上方法的觸發,但雙擊Home鍵,刪除該程式將會觸發,View Will DisappearView Did Disappear 兩個方法。
為什麼按下Home鍵之後沒有呼叫viewWillDisappear和viewDidDisappear呢?
因為在ios4後引入了後臺的概念,當按下Home鍵之後,程式被掛起了,但是該View依然是原來的View,並不是新的。所以只有記憶體不夠的時候或程式被終止的時候,才會呼叫viewWillDisappear和viewDidDisappear。

在補全兩個佈局的方法

alloc -> initWithNibName -> loadView -> viewDidLoad -> viewWillAppear -> viewWillLayoutSubviews -> viewDidLayoutSubviews -> viewDidAppear -> viewWillDisappear -> viewDidDisappear -> dealloc

方法分析

1.初始化方法

//指定初始化方法
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Custom initialization  
    }
    return self;
}
//

2.loadView方法
(1)該方法完成了檢視控制器的View 的建立。
(2)當有特殊需求需要自己建立檢視控制器 view 時, 則重寫該方法, 此方法是預設的,無特殊要求時不用重寫。
(3)當檢視控制器的 View 將要被使用時,系統自動呼叫該方法進行建立。
(4)不允許使用 super。 當[super loadView]在方法中時, 則不能建立一個 View, 則此方法並 ViewDidLoad 方法會迴圈執行,直到程式崩潰。
(5)在 loadview 中新增的 view 初始化不用必須新增 frame 的初值,但是在 viewdidload 中是必須要新增 frame 的初值的,否則頁面只能顯示不能觸發事件包括點選和輸入。

 -(void)loadView
 {
 //建立登陸介面
 LoginView *loginView = [[LoginView alloc] init];
 loginView.nameView.textField.delegate = self;
 loginView.passWordView.textField.delegate = self;
 self.view = loginView;
 [loginView release];
 }
 //

3.viewDidLoad方法
當 loadView方法執行完成後, view 建立之後立即呼叫,開發者檢視建立和其他操作大部分在此方法中新增。
如果重寫方法中程式碼包含 self.view = ???, 即重新為其指定 view時, 不需要呼叫父類實現[super viewDidLoad]; 否則, 則需要為呼叫父類實現.

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    self.view.backgroundColor = [UIColor redColor];
    //建立登陸介面
    _loginView = [[LoginView alloc] initWithFrame:self.view.bounds];
    _loginView.nameView.textField.delegate = self;
    _loginView.passWordView.textField.delegate = self;
    [self.view addSubview:_loginView];
    [_loginView release];
}
//

4.viewWillAppear和viewDidAppear方法
(1)在View 將要出現和已經出現的時候觸發。
(2)layoutSubviews的方法觸發時機在viewWillAppear和viewDidAppear方法之間。
(3)viewWillDisappear和viewDidDisappear是與其對應的,在 View 銷燬時觸發的,下面就不舉例說明了。

-(void)viewWillAppear:(BOOL)animated
{
    [super viewWillDisappear:YES];
    //do some thing
}
-(void)viewDidAppear:(BOOL)animated
{
    //do some thing
    [super viewDidAppear:YES];
}

5.viewWillLayoutSubviews方法
(1)該方法主要進行對檢視控制器的 view 以及其子檢視進行重新佈局。
(2) 在檢視控制器的 view 將要顯示的時候觸發。
(3)也就是說,只有在該方法中設定 view 的 frame 才是可行的
(4)viewDidLayoutSubviews在此方法觸發之後觸發。

-(void)viewWillLayoutSubviews
{
    [super viewWillLayoutSubviews];
    self.view.frame = CGRectMake(10, 10, 300, 548);
}

6.didReceiveMemoryWarning方法
(1)當應用可用記憶體過低導致系統發出記憶體警告的時候,便會觸發此方法。
(2)清除不需要的檢視,滿足以下兩個條件:1.檢視已經被建立 2.不需要在 window 上顯示了
(3)當從寫此方法時,需要呼叫父類。呼叫super的didReceiveMemoryWarning只是釋放controller的resouse,不會釋放view。
(4)具體過程:當系統記憶體不足時,首先UIViewController的didReceiveMemoryWarining 方法會被呼叫,而didReceiveMemoryWarining 會判斷當前ViewController的view是否顯示在window上,如果沒有顯示在window上,則didReceiveMemoryWarining 會自動將viewcontroller 的view以及其所有子view全部銷燬,然後呼叫viewcontroller的viewdidunload方法。如果當前UIViewController的view顯示在window上,則不銷燬該viewcontroller的view,當然,viewDidunload也不會被呼叫了。

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
    NSLog(@"@@@@@@@@@@記憶體警告@@@@@@@@@@");

    if ([self isViewLoaded] && !self.view.window) {
        self.view = nil;//將檢視清除
    }
}
//

7.dealloc 方法
(1)使用ARC的話,dealloc函式是不需要實現的,寫了反而會出錯。
(2)有些特殊的情況,dealloc函式還是需要的。比如,在畫面關閉的時候,需要把ViewController的某些資源釋放,在viewDidDissppear不一定合適,viewDidUnload一般情況下只在memory warning的時候才被呼叫。
MRC的情況下,我們自然會想到dealloc函式。

-(void)dealloc
{
    NSLog(@"dealloc");
}

loadView && viewDidLoad區別

這兩個方法是iphone開發中不可缺少的,他們都用來初始化檢視(而且都是在檢視載入的時候呼叫),但是他們也是又區別的。
簡單來說,就是當view的nib檔案為nil時,手工建立檢視介面時呼叫loadVIew;當view的nib檔案存在的時候,初始化工作在viewDidLoad中實現。但是如果你的程式執行期間記憶體不足,檢視控制器接到didReceiveMemoryWarning訊息時,那麼此時系統預設操作會檢查當前檢視控制器的view是否還在使用,假如此view不在當前正在使用的view hierarchy裡面,且控制器實現了loadView方法,那麼這個view將被release, loadView方法將被再次呼叫來建立一個新的view。

View的解除安裝

這裡寫圖片描述

相關推薦

26.ViewController生命週期及其方法介紹

ViewController ViewController是IOS開發中MVC模式中的C,ViewController是view的controller,ViewController的職責主要包括管理內部各個view的載入顯示和解除安裝,同時負責與其他ViewC

執行緒的生命週期方法

執行緒的生命週期: 指執行緒從建立到啟動,直至執行結束,可以通過呼叫Thread的相關方法影響執行緒的執行狀態 執行緒的執行狀態:: 新建、可執行、執行、阻塞、死亡 yield():若當前執行緒呼叫該方法,則由執行狀態變成可執行狀態 package org.jsoft.Threa

4.spriing:Bean的生命週期/工廠方法配置Bean/FactoryBean

1.Bean的生命週期  scope:singleton/prototype  1)spring容器管理singleton作用的生命週期,spring能夠精確知道Bean合適建立,何時初始化完成,以及何時被銷燬 2)spring容器管理prototype作用的生命週期,spring只

Vue提高篇-生命週期及其鉤子函式

1.前言 (a)每個Vue例項在被建立之前都要經過一系列的初始化過程,這個過程就是vue的生命週期; (b)vue一整個的生命週期中會有很多鉤子函式提供給我們在vue生命週期不同的時刻進行操作; (c)鉤子函式中最為常用的是建立(created),掛載(mounted)的操作; 2.

ViewController生命週期

應用啟動過程: 在main.m 中return ===》 UIApplicationMain      根據第三個引數建立UIApplication,可以自定義UIApplication,建立MyAp

Java 多執行緒(三)—— 執行緒的生命週期方法

這篇部落格介紹執行緒的生命週期。   執行緒是一個動態執行的過程,它也有從建立到死亡的過程。 執行緒的幾種狀態 在 Thread 類中,有一個列舉內部類: 上面的資訊以圖片表示如下:   第一張圖:  第二張圖:把等待、計時等待、阻塞看成阻塞一個狀態了 1、新建狀態(ne

Java 多執行緒— 執行緒的生命週期方法

這篇部落格介紹執行緒的生命週期。 執行緒是一個動態執行的過程,它也有從建立到死亡的過程。 執行緒的幾種狀態 在 Thread 類中,有一個列舉內部類: 上面的資訊以圖片表示如下: 第一張圖: 第二張圖:把等待、計時等待、阻塞看成阻塞一個狀態了 1、新

Spring中BeanFactory和ApplicationContext的生命週期及其區別詳解

Bean的生命週期 在很多技術中,都有生命週期這個概念,如在Android中,有Activity、Fragment等的生命週期;在Web容器中,有Servlet的生命週期。想要成為高階開發者,就必須要深入理解其生命週期。同樣的,在Spring容器中的Bean也

Tomcat 3.0版本的一些說明 以及 servlet 生命週期的簡單介紹

1.在Eclipse 內部可以把Tomcat 版本設定成3.0 這樣就可以省略掉書寫web.xml 檔案 2.在接下來的操作過程中以下專案不要勾選 3.這個時候可以觀察project Exploer中,WEB-INF 底下的lib 是沒有所謂的 web.xml 這個

mvn生命週期及其指令

mvn的指令大家都經常用到,但是說到生命週期,可能會有點懵。其實按照專案的構建和釋出過程來理解就可以了 default簡化版的生命週期包括: validate compile test package verify install deploy 驗證(validate)

Android--測試Activity的生命週期事件及其回撥方法

//activity_main.xml <?xml version="1.0" encoding="utf-8"?> <android.support.constraint.ConstraintLayout xmlns:android="h

React - 元件的生命週期詳解(及各階段呼叫的方法

轉自http://www.hangge.com/blog/cache/detail_1473.html React - 元件的生命週期詳解(及各階段呼叫的方法) 2016-12-22釋出:hangge閱讀:2699 ReactJS 的核心思想是元件化,即按功能封裝成一個一個的元

Servlet簡介及其生命週期詳解

簡介        Servlet生命週期,即闡述Servlet從產生到毀滅的整個過程。         在Servlet產生到消亡的過程中,有三個生

[Android]Android四大基本元件介紹生命週期

http://www.cnblogs.com/bravestarrhu/archive/2012/05/02/2479461.html Android四大基本元件介紹與生命週期 Android四大基本元件分別是Activity,S

常見的幾種生命週期模型及其適用範圍

1.瀑布模型 瀑布模型有以下優點: 1)為專案提供了按階段劃分的檢查點。 2)當前一階段完成後,您只需要去關注後續階段。 3)可在迭代模型中應用瀑布模型。 增量迭代應用於瀑布模型。迭代1解決最大的問題。每次迭代產生一個可執行的版本,同時增加更多的功能。每次迭代必須經過質量和整合測試。 2瀑布

Vue框架-基礎知識(vue指令、例項生命週期、計算屬性與監聽屬性、插槽理解、元件介紹、資料互動、ES6語法等)

Vue.js 介紹 vue.js是當下很火的一個JavaScript MVVM庫,它是以資料驅動和元件化的思想構建的。相比於Angular.js,Vue.js提供了更加簡潔、更易於理解的API,使得我們能夠快速地上手並使用Vue.js。 什麼是MVVM模式?

vue生命週期及例項的屬性和方法

vue的生命週期 vue例項從建立到銷燬的過程,稱為生命週期,共八個階段 window.onload=function(){ let vm = new Vue({ el:'#itany', data:{//儲存資料

Servlet(三):生命週期、常用方法、常見錯誤

Servlet的生命週期:從第一次呼叫,到伺服器關閉。如果在web.xml 中配置了load-on-startup則是從伺服器開啟到伺服器關閉。 注意: * init方法是對Servlet進行初始化的一個方法,會在Servlet第一次 載入進行儲存時執行 * destory方法是在servlet被銷

Java學習筆記--常用類及其常用方法介紹

object類 直接輸出一個物件的名稱,其實就是呼叫了該物件的toString()方法。 一般會重寫toString()方法,輸出成員變數的值。 物件名.getClass().getname()會得到類名。 equals()方法預設是比較兩個物件的地址是否相

在Spring Bean的生命週期中各方法的執行順序

Spring 容器中的 Bean 是有生命週期的,Spring 允許在 Bean 在初始化完成後以及 Bean 銷燬前執行特定的操作,常用的設定方式有以下十種: 通過實現 InitializingBean 介面來定製初始化之後的操作方法; 通過實現DisposableBean 介面來定