UIViewController中loadView, viewDidLoad, viewWillUnload, viewDidUnload, viewWillAppear, viewDidAppear, viewWillLayoutSubviews,viewDidLayoutSubviews,viewWillDisappear, viewDidDisappear方法,按照调用顺序说明如下:

调试日志:

1
2
3
4
5
6
7
8
9

2013-07-14 12:15:49.048 VCTest[13412:907] initWithNibName:bundle  /  initWithCoder #如果使用的StoryBoard
2013-07-14 12:15:49.056 VCTest[13412:907] loadView
2013-07-14 12:15:49.059 VCTest[13412:907] viewDidLoad
2013-07-14 12:15:49.061 VCTest[13412:907] viewWillAppear
2013-07-14 12:15:49.078 VCTest[13412:907] viewWillLayoutSubviews
2013-07-14 12:15:49.083 VCTest[13412:907] viewDidLayoutSubviews
2013-07-14 12:15:49.445 VCTest[13412:907] viewDidAppear
2013-07-14 12:16:00.624 VCTest[13412:907] viewWillDisappear
2013-07-14 12:16:00.997 VCTest[13412:907] viewDidDisappear

1. initWithNibName:bundle:

初始化UIViewController,执行关键数据初始化操作,注意这里不要做view相关操作,view在loadView方法中才初始化,这时loadView还未调用。如果使用StoryBoard进行视图管理,程序不会直接初始化一个UIViewController,StoryBoard会自动初始化或在segue被触发时自动初始化,因此方法initWithNibName:bundle:不会被调用。如果在代码里面使用instantiateViewControllerWithIdentifier:方法显示初始化一个UIViewController,则initWithCoder方法会被调用。

如果是通过调用initWithNibName:bundle指定nib文件名初始化的话,ViewController会根据此nib来创建View。如果name参数为nil,则ViewController会通过以下两个步骤找到与其关联的nib:
1)如果ViewController的类名以“Controller”结尾,例如ViewController的类名是MyViewController,则查找是否存在MyView.nib;
2)找跟ViewController类名一样的文件,例如MyViewController,则查找是否存在MyViewController.nib

2. loadView

当访问UIViewController的view属性时,view如果此时是nil,那么VC会自动调用loadView方法来初始化一个UIView并赋值给view属性。此方法用在初始化关键view,需要注意的是,在view初始化之前,不能先调用view的getter方法,否则将导致死循环(除非先调用了[supper loadView];)。

1
2
3
4
5
6
7
8
9
10
11
12

-(void)loadView{
    NSLog(@"loadView");
    //错误,将导致死循环,因此此时view=nil,VC会再次调用loadView来初始化view
    self.view.backgroundColor = [UIColor greenColor];
}
-(void)loadView{
    NSLog(@"loadView");
    //正确,先初始化view
    self.view = [[MyView alloc] init];
    self.view.backgroundColor = [UIColor greenColor];
}

如果没有重载loadView方法,则UIViewController会从nib或StoryBoard中查找默认的loadView,默认的loadView会返回一个空白的UIView对象。

3. viewDidLoad

当VC的view对象载入内存后调用,用于对view进行额外的初始化操作

4. viewWillAppear

在view即将添加到视图层级中(显示给用户)且任意显示动画切换之前调用(这个时候supperView还是nil)。这个方法中完成任何与视图显示相关的任务,例如改变视图方向、状态栏方向、视图显示样式等

5. viewDidAppear

在view被添加到视图层级中,显示动画切换之后调用(这时view已经添加到supperView中)。在这个方法中执行视图显示相关附件任务,如果重载了这个方法,必须在方法中调用[supper viewDidAppear];

6. viewWillLayoutSubviews

view即将布局其Subviews。比如view的bounds改变了(例如状态栏从不显示到显示,视图方向变化),要调整Subviews的位置,在调整之前要做的一些工作就可以在该方法中实现。

7. viewDidLayoutSubviews

view已经布局其Subviews。比如view的bounds改变了(例如状态栏从不显示到显示,视图方向变化),已经调整Subviews的位置,在调整完成之后要做的一些工作就可以在该方法中实现。

8. viewWillDisappear

view即将从superView中移除且移除动画切换之前,此时还没有调用removeFromSuperview。

9. viewDidDisappear

view从superView中移除,移除动画切换之后调用,此时已调用removeFromSuperview。

10. viewWillUnload

在VC的view对象从内存中释放之前调用,可以在view被释放前做一些资源清理操作。在iOS6.0开始就废弃了,该方法不再会调用

11. viewDidUnload

在VC的view对象从内存中释放之后调用,可以在view被释放后做一些view相关的引用清理操作,此时view为nil。在iOS6.0开始就废弃了,该方法不再会调用

当一个视图被移除屏幕并且销毁的时候的执行顺序,这个顺序差不多和上面的相反 
1、viewWillDisappear            视图将被从屏幕上移除之前执行 
2、viewDidDisappear             视图已经被从屏幕上移除,用户看不到这个视图了 
3、dealloc                                 视图被销毁,此处需要对你在init和viewDidLoad中创建的对象进行释放

转载于:https://www.cnblogs.com/guoxiaoqian/p/4564883.html

转:UIViewController中各方法调用顺序及功能详解相关推荐

  1. JavaScript中sort方法的使用及原理详解

    原生JS中提供了两个用来重排序的方法:reverse()和sort(),reverse()没什么好说的,就是直接使数组反转,例如下面的栗子: var arr = [1, 2, 3, 4, 5, -1, ...

  2. Python对象中__del__方法起作用的条件详解

    对象的__ del __是对象在被gc消除回收的时候起作用的一个方法,它的执行一般也就意味着对象不能够继续引用. 示范代码如下: class Demo: def __del__(self): prin ...

  3. php类和自定义函数实例,php中三个调用用户自定义函数实例详解

    在php中调有自定义函数,经常会用到call_user_func函数.call_user_func_array函数.call_user_func函数. 1,call_user_func函数类似于一种特 ...

  4. dede 模板 php sql,dedecms模板中使用{dede:sql=””}实现分页功能详解

    相信很多使用织梦dedecms的朋友在网上查找关于dede:sql标签进行分页的解决方案时都不尽如人意,尤其是在列表页使用dede:sql调用外部数据(所谓调用外部数据就是指在后台只是创建个空栏目,然 ...

  5. android系统中sd卡各文件夹功能详解 guessword,AndroidStudio LiveTemplate函数说明

    1.annotated() 返回类.方法.属性的注解 例如:annotated("java.lang.Deprecated"),返回@Deprecated注解 2.arrayVar ...

  6. htc android sd卡,【HTC T328W】Android系统中SD卡各文件夹功能详解

    希望你的补充说明,让我们一起来清理内存卡吧注意,软件没有卸载前,不建议删除其文件荚!1..android_secure       是官方app2sd的产物,删了之后装到sd卡中的软件就无法使用了,小 ...

  7. VS 中 TFS 的工作项查询功能详解

    在团队开发中,一般都要使用一些工具来追踪项目开发进度.在 VS 中可以使用 TFS 的工作项来追踪项目开发进度.下面介绍一下使用 TFS 如何进行工作项的查询. 环境: VS 2017 + TFS 2 ...

  8. Android系统中SD卡各文件夹功能详解

    1..android_secure  是官方app2sd的产物,删了之后装到sd卡中的软件就无法使用了. 2..Bluetooth  顾名思 义,用蓝牙之后就会有这个. 3..mobo  顾名思 义, ...

  9. Tornado-02-Tornado、路由进阶、视图进阶(视图中内置的钩子方法、视图方法调用顺序、冲刷缓存、用户认证)、模板语法(基本语法、内置标签或函数)

    Tornado 一.路由进阶 路由语法和参数 在路由列表的路由成员中,我们一共可以设置4个参数 url(r"/uri路径", 视图类, {"参数名":" ...

  10. @transactional注解_为啥同一个类中普通方法调用Spring注解方法,注解会失效?看完你就明白,So easy!...

    Spring注解(如@Transactional.@Cacheable.@Async等),在使用不当时,很可能会失效.失效的情况有很多种,本文我们就来瞅瞅,为啥同一个类中普通方法调用Spring注解方 ...

最新文章

  1. vue.js $refs和$emit 父子组件交互
  2. Redis的Errorlog或者启动日志(错误日志)的配置
  3. node.js编程错误记录集
  4. android能用svg格式,Android加载html中svg格式图片进行显示
  5. 【LeetCode】剑指 Offer 52. 两个链表的第一个公共节点
  6. 苹果将明年上半年iPhone出货量目标提高 30%
  7. 【操作系统笔记】中断系统
  8. pytorch 画loss曲线_Pytorch练习amp;#8211;绘制Loss曲线 - 易采站长站
  9. 2018年值得推荐的20个Bootstrap网站模板
  10. 实战:tomcat版本升级
  11. linux 安装redies
  12. 信号与系统Matlab实验1
  13. 解决Cannot find module ‘./index.module.scss‘ or its corresponding type declarations.ts(2307)
  14. python求一元三次方程的根_方程的计算机处理924_Fortran
  15. 感谢一路上有你们的陪伴
  16. 基于单片机的自动分拣小车的设计--毕业设计参考
  17. 感性负载对电源的影响有多大?
  18. word中图片为嵌入式格式时显示不全_word中图片设置嵌入式后无法显示完整的解决方案(转)...
  19. 尖刀出鞘的display常用属性及css盒模型深入研究
  20. 解决:Tomcat启动提示At least one JAR was scanned for TLDs yet contained no TLDs

热门文章

  1. memcpy-avx-unaligned/strcpy_sse2_unaligned崩溃记录
  2. 光干涉波谷,有可能低于绝对零度
  3. 管理感悟:把公司搞死,然后抱怨融资困难
  4. python中访问lmdb
  5. shiro 拦截未登录的ajax_Springboot+thymeleaf+Shiro继承,亲测可用
  6. 本科计算机相关课程设计,计算机科学及技术专业本科生大学课程设计.doc
  7. c# 调用webservice未能连接到服务器连接不上报登录失败,C#动态调用webService出现 基础连接已经关闭: 未能为 SSL/TLS 安全通道建立信任关系。...
  8. python类概念是什么意思_python面向对象是什么意思?面向对象九大概念简介
  9. 异步更新php数据库,ajax异步刷新实现更新数据库_jquery
  10. pxe dhcp offer之后没有_秒懂DHCP是什么