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

ViewControlleriOS开发中MVC模式中的CViewControllerviewControllerViewController的职责主要包括管理内部各个view的加载显示和卸载,同时负责与其他ViewController的通信和协调。

分类

在iOS中,有两类ViewController,一类是显示内容的,比如UIViewControllerUITableViewController等,同时还可以自定义继承自UIViewController;另一类是ViewController容器,UINavigationControllerUITabBarController等,UINavigationController是以Stack的形式来存储和管理ViewControllerUITabBarController是以Array的形式来管理ViewController

加载过程

Controller中创建View有两种方法,一种是使用Storyboard等可视化工具,另一种是通过代码创建。
可视化工具在开发中方便快捷,但是流畅性不如纯代码的方式创建。

ViewController生命周期

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

注意viewWillUnloadviewDidUnload已经在iOS6被废弃了,因为Clearing references to views is no longer necessary.
注意:没有viewWillLoad
注意:viewDidLoadviewDidUnload并不是成对的。

程序运行中按下Home键,程序并没有以上方法的触发,但双击Home键,删除该程序将会触发,View Will DisappearView Did Disappear 两个方法。
为什么按下Home键之后没有调用viewWillDisappearviewDidDisappear呢?
因为在iOS4后引入了后台的概念,当按下Home键之后,程序被挂起了,但是该View依然是原来的View,并不是新的。所以只有内存不够的时候或程序被终止的时候,才会调用viewWillDisappearviewDidDisappear

在补全两个布局的方法

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的方法触发时机在viewWillAppearviewDidAppear方法之间。
(3)viewWillDisappearviewDidDisappear是与其对应的,在 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)也就是说,只有在该方法中设置 viewframe 才是可行的
(4)viewDidLayoutSubviews在此方法触发之后触发。

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

6.didReceiveMemoryWarning方法

(1)当应用可用内存过低导致系统发出内存警告的时候,便会触发此方法。
(2)清除不需要的视图,满足以下两个条件:1.视图已经被创建 2.不需要在 window 上显示了
(3)当从写此方法时,需要调用父类。调用superdidReceiveMemoryWarning只是释放controllerresouse,不会释放view
(4)具体过程:当系统内存不足时,首先UIViewController
didReceiveMemoryWarining 方法会被调用,而didReceiveMemoryWarining 会判断当前ViewControllerview是否显示在window上,如果没有显示在window上,则didReceiveMemoryWarining 会自动将viewcontrollerview以及其所有子view全部销毁,然后调用viewcontrollerviewdidunload方法。如果当前UIViewControllerview显示在window上,则不销毁该viewcontrollerview,当然,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开发中不可缺少的,他们都用来初始化视图(而且都是在视图加载的时候调用),但是他们也是又区别的。
简单来说,就是当viewnib文件为nil时,手工创建视图界面时调用loadVIew;当viewnib文件存在的时候,初始化工作在viewDidLoad中实现。但是如果你的程序运行期间内存不足,视图控制器接到didReceiveMemoryWarning消息时,那么此时系统默认操作会检查当前视图控制器的view是否还在使用,假如此view不在当前正在使用的view hierarchy里面,且控制器实现了loadView方法,那么这个view将被release, loadView方法将被再次调用来创建一个新的view

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,390评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,821评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,632评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,170评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,033评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,098评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,511评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,204评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,479评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,572评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,341评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,213评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,576评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,893评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,171评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,486评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,676评论 2 335

推荐阅读更多精彩内容