浅谈UIViewController生命周期

UIViewController是IOS中顶层视图的载体和控制器,用户与程序界面的交互都是由UIViewController来控制的,UIViewController管理UIView的生命周期及资源的加载与释放。

我们创建一个简单的demo来测试一下其生命周期,新建两个ViewController,一个是A页面,一个是B页面。A页面有个按钮可以跳转到B页面,并且在每个ViewController的每个方法中都添加了NSLog来打印其状态。截取AViewController.m部分代码如下,

 #pragma mark -- 生命周期test---(instancetype)init{
    if(self = [super init]){
        self.title = @"A页面";
    }
    NSLog(@"init :%@",self.title);
    return self;
}

-(void ) loadView{
    [super loadView];
    NSLog(@"LoadView :%@",self.title);
}

-(void)viewDidLoad {
    [super viewDidLoad];
    NSLog(@"viewDidLoad :%@",self.title);
    [self setupUI];
}

-(void) viewWillAppear:(BOOL)animated{
    [ super viewWillAppear:animated];
    NSLog(@"viewWillAppear :%@",self.title);
}

-(void) viewDidAppear:(BOOL)animated{
    [super viewDidAppear:animated];
    NSLog(@"viewDidAppear :%@",self.title);
}

-(void) viewWillDisappear:(BOOL)animated{
    [super viewWillDisappear:animated];
    NSLog(@"viewWillDisappear :%@",self.title);
}

-(void) viewDidDisappear:(BOOL)animated{
    [super viewDidDisappear:animated];
    NSLog(@"viewDidDisappear :%@",self.title);
}

-(void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    NSLog(@"didReceiveMemoryWarning :%@",self);
}
-(void) dealloc{
    NSLog(@"dealloc: %@",self.title);
}

然后开始运行测试

case 1:第一次启动APP

点击开始按钮后,进入A页面,如下图

这时打印出的信息如下

分析

可见,执行的方法如下

1、(alloc)init

分配地址并初始化ViewController对象

2、loadView

每个ViewController都会有一个view的属性,是一个UIView类型。loadView方法就是用于加载这个这个view,通常这一步不需要去干涉,父类已经实现好了,如果要重写这个方法,要么调用父类的该方法,要么自定义一个UIView对象并赋值给当前ViewController的view属性。这个view相当于一个画布,其他的自定义控件一般都是添加到它上面的。

3、viewDidLoad

顾名思义,也就是上面说到的view加载完了就会调用这个方法,一些自定义控件的代码可以在这里写。

4、viewWillAppear

视图将要显示在屏幕前调用 。

5、viewDidAppear

视图已经在屏幕渲染完成后调用。

case 2:点击按钮,从A页面push到B页面

如下图所示

控制台打印信息为

分析:

1、B页面 init

2、B页面 loadView

3、B页面 viewDidLoad

4、A页面 viewWillDisappeare

前三点在#case 1#已经分析过了就不分析了。第4点viewWillDisappeare,是在A页面即将要消失在屏幕时调用,一个新的页面出现总会有个旧的页面消失

5、B页面 viewWillAppear

6、A页面 viewDidDisappear

在页面已经消失在屏幕后调用。

7、viewDidAppear

case 3:点击左上角的返回,关闭B页面,并返回A页面

控制台打印信息如下

分析:

前四个方法在上面已经分析过了,就不累赘了,第五个方法是dealloc,是在视图销毁时执行,因为从B页面返回到A页面后,B页面已经不需要了(在A页面永远不知道下一个切换的页面是哪里),和#case 2#不同的是,因为从A页面push到B页面,A页面还是有存在的价值的(因为还需要返回到A页面,如果销毁了A就没办法返回了),所以A页面是没有调用dealloc方法的。在这个方法里面一般是做一些释放内存的操作。

case 4:当从A页面push到B页面后,模拟内存不足,控制台打印信息如下

分析:

由打印信息可知,当内存不足时就会触发didReceiveMemoryWarning 方法,每个viewController的此方法都会被调用。

总结:

由上面的的例子可知,一个页面要被创建就会经过一下几步

step 1:(alloc)init

step 2: loadView

step 3: viewDidView

step 4: viewWillAppear

step 5: viewDidAppear

一个页面要被移除,会经过如下几步

step 1: viewWillDisappear

step 2: viewDidDisappear

step 3:dealloc (如果不再需要这个页面了才执行)

下图是对上面分析的总结

扩展:

1、当在AViewController.m的 init、 loadView、 viewDidView或viewWillAppear的方法里面添加sleep(5)语句时,会发现启动APP后要等大概5秒左右才能显示出A页面,可见,如果出现页面加载缓慢等问题,有可能是在这几个方法中耗时操作过多。

2、当在AViewController.m中的viewDidAppear方法中加入sleep(5)语句,会发现,虽然A页面已经渲染完成了,但是里面的控件却无法操作,比如按钮点击无响应。可见,一些页面卡顿,响应迟钝等问题可能是在这个方法中耗时操作过多。

基本的生命周期大概如此,如有错误或需要补充说明,欢迎指正

时间: 2024-09-26 23:26:08

浅谈UIViewController生命周期的相关文章

initWithFrame、initWithCoder、awakeFromNib的区别和调用次序 & UIViewController生命周期 查缺补漏

当我们创建或者自定义一个UI控件时,就很可能会调用awakeFromNib.initWithCoder .initWithFrame这些方法.三者的具体区别如下: initWithFrame: 通过代码创建UI控件的时候就会调用: initWithCoder:从文件中解析一个对象的时候就会调用这个方法,也就是说无论是通过代码还是xib,程序运行的时候都会调用这个方法: awakeFromNib:当一个对象从xib或者storyboard中加载完毕后,就会调用一次. 比如:当苹果官方提供的按钮不能

UIViewController生命周期控制

UIViewController生命周期控制 UIViewController介绍 官方的介绍例如以下 The UIViewController class provides the fundamental view-management model for all iOS apps. You rarely instantiate UIViewController objects directly. Instead, you instantiate subclasses of the UIVie

iOS对UIViewController生命周期和属性方法的解析

目录[-] iOS对UIViewController生命周期和属性方法的解析 一.引言 二.UIViewController的生命周期 三.从storyBoard加载UIViewController实例的传值陷阱 四.UIViewController与StroyBoard的相关相互方法 1.ViewController直接在StoryBoard中进行跳转的传值 2.使用代码跳转Storyboard中的controller 五.UIViewController之间的一些从属关系 1.parentV

从实践谈iOS生命周期

从实践谈iOS生命周期 个人感觉生命周期无论在Android,还是iOS都是很重要的概念,因为在每个声明周期的状态下我们可以做很多预加载或者处理的操作.因此在这里主要总结下ViewController和AppDelegate中的一些状态. 应用程序的状态 看下这个图: Foreground :前台 Background :后台 Not running:应用程序并没有启动 Inactive :应用程序运行在前台但是没有接收到事件响应 Active :应用程序运行在前台接受到事件响应 Backgro

【iOS开发】iOS对UIViewController生命周期和属性方法的解析

iOS对UIViewController生命周期和属性方法的解析 一.引言 作为MVC设计模式中的C,Controller一直扮演着项目开发中最重要的角色,它是视图和数据的桥梁,通过它的管理,将数据有条有理的展示在我们的View层上.iOS中的UIViewController是UIKit框架中最基本的一个类.从第一个UI视图到复杂完整项目,都离不开UIViewController作为基础.基于UIViewController的封装和扩展,也能够出色的完成各种复杂界面逻辑.这篇博客,旨在讨论UIV

你真的了解UIViewController生命周期吗?

一:首先了解一下生命周期图 二:UIViewController 生命周期介绍 1.通过alloc init 分配内存,初始化controller. 2.loadView loadView方法默认实现[super loadView] 如果在初始化controller时指定了xib文件名,就会根据传入的xib文件名加载对应的xib文件,如果没传xib文件名,默认会加载跟controller同名的xib文件,如果没找到相关联的xib文件,就会创建一个空白的UIView,然后赋給controller的

【iOS】UIViewController生命周期

UIViewController有2周期: 在UIViewController中,View存在两个循环:载入循环和卸载循环. 载入循环 1>程序请求controller的view. 2>假设view在内存中,则直接载入.相反,假设不存在.则UIViewController调用loadView方法. 3>loadView方法运行例如以下操作: 假设你重载了这种方法,则必须创建必要的view而且将一个非nil值传给UIViewController的view属性. 假设你没有重载这个函数,UI

angular2系列教程(五)Structural directives、再谈组件生命周期

今天,我们要讲的是structural directives和组件生命周期这两个知识点.structural directives顾名思义就是改变dom结构的指令.著名的内建结构指令有 ngIf, ngSwitch and ngFor. 例子 例子是我自己改写的,编写一个structural directives,然后通过这个指令实例化和注销组件,在此同时监视组件生命周期. 源代码 UnlessDirective 这个指令是官网示例中的指令. src/unless.directive.ts im

【分享】UIViewController生命周期简单归纳

一.调用顺序: 1. + (id)alloc 分配内存: 2. - (id)init 方法(包括其他-(id)init...方法),只允许调用一次,并且要与 alloc方法 写在一起,在init方法中申请的内存,要在dealloc方法中释放(或者其他地方): 3. - (void)awakeFromNib 使用Xib初始化后会调用此方法,一般不会重写此方法: 4. - (void)loadView 如果使用Xib创建ViewController,就不要重写该方法.一般不会修改此方法: 5. -