12.ViewController的生命周期及其方法介紹

ViewControlleriOS開發(fā)中MVC模式中的C嗡午,ViewControllerviewController吴裤,ViewController的職責(zé)主要包括管理內(nèi)部各個(gè)view的加載顯示和卸載售躁,同時(shí)負(fù)責(zé)與其他ViewController的通信和協(xié)調(diào)。

分類

在iOS中,有兩類ViewController,一類是顯示內(nèi)容的辽剧,比如UIViewControllerUITableViewController等税产,同時(shí)還可以自定義繼承自UIViewController怕轿;另一類是ViewController容器,UINavigationControllerUITabBarController等辟拷,UINavigationController是以Stack的形式來存儲(chǔ)和管理ViewController撞羽,UITabBarController是以Array的形式來管理ViewController

加載過程

Controller中創(chuàng)建View有兩種方法衫冻,一種是使用Storyboard等可視化工具诀紊,另一種是通過代碼創(chuàng)建。
可視化工具在開發(fā)中方便快捷隅俘,但是流暢性不如純代碼的方式創(chuàng)建邻奠。

ViewController生命周期

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

注意viewWillUnloadviewDidUnload已經(jīng)在iOS6被廢棄了,因?yàn)?code>Clearing references to views is no longer necessary.
注意:沒有viewWillLoad
注意:viewDidLoadviewDidUnload并不是成對(duì)的为居。

程序運(yùn)行中按下Home鍵碌宴,程序并沒有以上方法的觸發(fā),但雙擊Home鍵蒙畴,刪除該程序?qū)?huì)觸發(fā)贰镣,View Will DisappearView Did Disappear 兩個(gè)方法。
為什么按下Home鍵之后沒有調(diào)用viewWillDisappearviewDidDisappear呢膳凝?
因?yàn)樵?code>iOS4后引入了后臺(tái)的概念八孝,當(dāng)按下Home鍵之后,程序被掛起了鸠项,但是該View依然是原來的View干跛,并不是新的。所以只有內(nèi)存不夠的時(shí)候或程序被終止的時(shí)候祟绊,才會(huì)調(diào)用viewWillDisappearviewDidDisappear楼入。

在補(bǔ)全兩個(gè)布局的方法

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的創(chuàng)建
(2)當(dāng)有特殊需求需要自己創(chuàng)建視圖控制器view時(shí)哥捕,則重寫該方法。此方法是默認(rèn)的嘉熊。無(wú)特殊要求時(shí)不用重寫遥赚。
(3)當(dāng)視圖控制器的View將要被使用時(shí),系統(tǒng)自動(dòng)調(diào)用該方法進(jìn)行創(chuàng)建阐肤。
(4)不允許使用super凫佛。當(dāng)[super loadView]在方法中時(shí),則不能創(chuàng)建一個(gè)View孕惜,則此方法和ViewDidLoad方法會(huì)循環(huán)執(zhí)行愧薛,直到程序崩潰。
(5)在loadview中添加的view初始化不用必須添加frame的初值衫画,但是在viewdidload中是必須添加frame的初值的毫炉,否則頁(yè)面只能顯示不能觸發(fā)包括點(diǎn)擊和輸入。

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

3.viewDidLoad方法

當(dāng)loadView方法執(zhí)行完成后削罩,view創(chuàng)建之后立即調(diào)用瞄勾,開發(fā)者視圖創(chuàng)建和其他操作大部分在此方法中添加。
如果重寫方法中代碼包含self.view = 弥激?进陡??微服,即重新為其指定view時(shí)四濒,不需要調(diào)用父類實(shí)現(xiàn)[super viewDidLoad];否則,則需要為調(diào)用父類實(shí)現(xiàn)职辨。

-(void)viewDidLoad
{
  [super viewDidLoad];
  // Do any additional setup after loading the view.
    self.view.backgroundColor = [UIColor redColor];
    //創(chuàng)建登陸界面
    _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 將要出現(xiàn)和已經(jīng)出現(xiàn)的時(shí)候觸發(fā)盗蟆。
(2)layoutSubviews的方法觸發(fā)時(shí)機(jī)在viewWillAppearviewDidAppear方法之間。
(3)viewWillDisappearviewDidDisappear是與其對(duì)應(yīng)的,在 View 銷毀時(shí)觸發(fā)的,下面就不舉例說明了舒裤。

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

5.viewWillLayoutSubviews方法

(1)該方法主要進(jìn)行對(duì)視圖控制器的 view 以及其子視圖進(jìn)行重新布局喳资。
(2) 在視圖控制器的view 將要顯示的時(shí)候觸發(fā)。
(3)也就是說,只有在該方法中設(shè)置 viewframe 才是可行的
(4)viewDidLayoutSubviews在此方法觸發(fā)之后觸發(fā)腾供。

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

6.didReceiveMemoryWarning方法

(1)當(dāng)應(yīng)用可用內(nèi)存過低導(dǎo)致系統(tǒng)發(fā)出內(nèi)存警告的時(shí)候,便會(huì)觸發(fā)此方法仆邓。
(2)清除不需要的視圖,滿足以下兩個(gè)條件:1.視圖已經(jīng)被創(chuàng)建 2.不需要在 window 上顯示了
(3)當(dāng)從寫此方法時(shí),需要調(diào)用父類。調(diào)用superdidReceiveMemoryWarning只是釋放controllerresouse伴鳖,不會(huì)釋放view节值。
(4)具體過程:當(dāng)系統(tǒng)內(nèi)存不足時(shí),首先UIViewController
didReceiveMemoryWarining 方法會(huì)被調(diào)用榜聂,而didReceiveMemoryWarining 會(huì)判斷當(dāng)前ViewControllerview是否顯示在window上搞疗,如果沒有顯示在window上,則didReceiveMemoryWarining 會(huì)自動(dòng)將viewcontrollerview以及其所有子view全部銷毀须肆,然后調(diào)用viewcontrollerviewdidunload方法匿乃。如果當(dāng)前UIViewControllerview顯示在window上桩皿,則不銷毀該viewcontrollerview,當(dāng)然幢炸,viewDidunload也不會(huì)被調(diào)用了泄隔。

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
    NSLog(@"@@@@@@@@@@內(nèi)存警告@@@@@@@@@@");

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

7.dealloc 方法

(1)使用ARC的話,dealloc函數(shù)是不需要實(shí)現(xiàn)的宛徊,寫了反而會(huì)出錯(cuò)佛嬉。
(2)有些特殊的情況,dealloc函數(shù)還是需要的闸天。比如暖呕,在畫面關(guān)閉的時(shí)候,需要把ViewController的某些資源釋放号枕,在viewDidDissppear不一定合適缰揪,viewDidUnload一般情況下只在memory warning的時(shí)候才被調(diào)用陨享。
MRC的情況下葱淳,我們自然會(huì)想到dealloc函數(shù)。

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

loadView && viewDidLoad區(qū)別

這兩個(gè)方法是iphone開發(fā)中不可缺少的抛姑,他們都用來初始化視圖(而且都是在視圖加載的時(shí)候調(diào)用)赞厕,但是他們也是又區(qū)別的。
簡(jiǎn)單來說定硝,就是當(dāng)viewnib文件為nil時(shí)皿桑,手工創(chuàng)建視圖界面時(shí)調(diào)用loadVIew;當(dāng)viewnib文件存在的時(shí)候蔬啡,初始化工作在viewDidLoad中實(shí)現(xiàn)诲侮。但是如果你的程序運(yùn)行期間內(nèi)存不足,視圖控制器接到didReceiveMemoryWarning消息時(shí)箱蟆,那么此時(shí)系統(tǒng)默認(rèn)操作會(huì)檢查當(dāng)前視圖控制器的view是否還在使用沟绪,假如此view不在當(dāng)前正在使用的view hierarchy里面,且控制器實(shí)現(xiàn)了loadView方法空猜,那么這個(gè)view將被release, loadView方法將被再次調(diào)用來創(chuàng)建一個(gè)新的view绽慈。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市辈毯,隨后出現(xiàn)的幾起案子坝疼,更是在濱河造成了極大的恐慌,老刑警劉巖谆沃,帶你破解...
    沈念sama閱讀 217,406評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件钝凶,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡唁影,警方通過查閱死者的電腦和手機(jī)腿椎,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門桌硫,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人啃炸,你說我怎么就攤上這事铆隘。” “怎么了南用?”我有些...
    開封第一講書人閱讀 163,711評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵膀钠,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我裹虫,道長(zhǎng)肿嘲,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,380評(píng)論 1 293
  • 正文 為了忘掉前任筑公,我火速辦了婚禮雳窟,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘匣屡。我一直安慰自己封救,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,432評(píng)論 6 392
  • 文/花漫 我一把揭開白布捣作。 她就那樣靜靜地躺著誉结,像睡著了一般。 火紅的嫁衣襯著肌膚如雪券躁。 梳的紋絲不亂的頭發(fā)上惩坑,一...
    開封第一講書人閱讀 51,301評(píng)論 1 301
  • 那天,我揣著相機(jī)與錄音也拜,去河邊找鬼以舒。 笑死,一個(gè)胖子當(dāng)著我的面吹牛慢哈,可吹牛的內(nèi)容都是我干的蔓钟。 我是一名探鬼主播,決...
    沈念sama閱讀 40,145評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼岸军,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼奋刽!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起艰赞,我...
    開封第一講書人閱讀 39,008評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤佣谐,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后方妖,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體狭魂,經(jīng)...
    沈念sama閱讀 45,443評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,649評(píng)論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了雌澄。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片斋泄。...
    茶點(diǎn)故事閱讀 39,795評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖镐牺,靈堂內(nèi)的尸體忽然破棺而出炫掐,到底是詐尸還是另有隱情,我是刑警寧澤睬涧,帶...
    沈念sama閱讀 35,501評(píng)論 5 345
  • 正文 年R本政府宣布募胃,位于F島的核電站,受9級(jí)特大地震影響畦浓,放射性物質(zhì)發(fā)生泄漏痹束。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,119評(píng)論 3 328
  • 文/蒙蒙 一讶请、第九天 我趴在偏房一處隱蔽的房頂上張望祷嘶。 院中可真熱鬧,春花似錦夺溢、人聲如沸论巍。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)环壤。三九已至晒来,卻和暖如春钞诡,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背湃崩。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工荧降, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人攒读。 一個(gè)月前我還...
    沈念sama閱讀 47,899評(píng)論 2 370
  • 正文 我出身青樓朵诫,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親薄扁。 傳聞我的和親對(duì)象是個(gè)殘疾皇子剪返,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,724評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容