一、结构

按结构可以对iOS的所有ViewController分成两类:
1、主要用于展示内容的ViewController,这种ViewController主要用于为用户展示内容,并与用户交互,如UITableViewController,UIViewController。
2、用于控制和显示其他ViewController的ViewController。这种ViewController一般都是一个ViewController的容器。如UINavigationController,UITabbarController。它们都有一个属性:viewControllers。其中UINavigationController表示一种Stack式结构,push一个ViewController或pop一次,因此后一个ViewController一般会依赖前一个ViewController。而UITabbarController表示一个Array结构,各个ViewController是并列的。
第一种ViewController会经常被继承,用来显示不同的数据给用户。而第二种很少被继承,除非你真的需要自定义它。
注:细心的同学应该能发现,在Xcode中新建一个ViewController时,只可以选择继承自UIViewController和UITableViewController,而它们都是第一种。

二、Controller和View的生命周期

这里指的View是指Controller的View。它作为Controler的属性,生命周期在Controller的生命周期内。就是说你的Controller不能在view释放前就释放了。

ViewController生命周期


当你alloc并init了一个ViewController时,这个ViewController应该是还没有创建view的。ViewController的view是使用了lazyInit方式创建,就是说你调用的view属性的getter:[self view]。在getter里会先判断view是否创建,如果没有创建,那么会调用loadView来创建view。loadView完成时会继续调用viewDidLoad。loadView和viewDidLoad的一个区别就是:loadView时还没有view。而viewDidLoad时view以及创建好了。
当view被添加其他view中之前时,会调用viewWillAppear,而之后会调用viewDidAppear。
当view从其他view中移出之前时,会调用viewWillDisAppear,而之后会调用viewDidDisappear。
当view不在使用,而且是disappeared,受到内存警告时,那么viewController会将view释放并将其指向nil。

三、代码组织(如何设计良好的viewcontroller)

ViewController生命周期中有那么多函数,一个重要问题就是什么代码该写在什么地方。
1、init里不要出现创建view的代码。良好的设计,在init里应该只有相关数据的初始化,而且这些数据都是比较关键的数据。init里不要掉self.view,否则会导致viewcontroller创建view。(因为view是lazyinit的)。
2、loadView中只初始化view,一般用于创建比较关键的view如tableViewController的tabView,UINavigationController的navgationBar,不可掉用view的getter(在掉super loadView前),最好也不要初始化一些非关键的view。如果你是从nib文件中创建的viewController在这里一定要首先调用super的loadView方法,但建议不要重载这个方法。
3、viewDidLoad 这时候view已经有了,最适合创建一些附加的view和控件了。有一点需要注意的是,viewDidLoad会调用多次(viewcontroller可能多次载入view,参见图2)。
4、viewWillAppear 这个一般在view被添加到superview之前,切换动画之前调用。在这里可以进行一些显示前的处理。比如键盘弹出,一些特殊的过程动画(比如状态条和navigationbar颜色)。
5、viewDidAppear 一般用于显示后,在切换动画后,如果有需要的操作,可以在这里加入相关代码。

6、viewDidUnload 这时候viewController的view已经是nil了。由于这一般发生在内存警告时,所以在这里你应该将那些不在显示的view释放了。比如你在viewcontroller的view上加了一个label,而且这个label是viewcontroller的属性,那么你要把这个属性设置成nil,以免占用不必要的内存,而这个label在viewDidLoad时会重新创建

转载于:https://www.cnblogs.com/pengjuwang/p/5052233.html

viewController的生命周期相关推荐

  1. iOS开发-ViewController的生命周期和切换

    ViewController在App开发中是至关重要的一环,无论是页面的展示和数据之间的交互,ViewController提供了一个框架可以管理和构建App应用.iOS中构建App提供了两种方式一种是 ...

  2. iOS ViewController的生命周期

    ViewController的简单生命周期: loadView:创建视图控制器(如果不是从.xib加载) viewDidLoad:视图已加载 viewWillAppear:视图加载前运行 viewWi ...

  3. ViewController的生命周期分析和使用

    iOS的SDK中提供很多原生ViewController,大大提高了我们的开发效率,下面是我的一些经验. 一.结构 按结构可以对iOS的所有ViewController分成两类: 1.主要用于展示内容 ...

  4. IOS学习笔记——ViewController生命周期详解

    在我之前的学习笔记中讨论过ViewController,过了这么久,对它也有了新的认识和体会,ViewController是我们在开发过程中碰到最多的朋友,今天就来好好认识一下它.ViewContro ...

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

    iOS对UIViewController生命周期和属性方法的解析 一.引言 作为MVC设计模式中的C,Controller一直扮演着项目开发中最重要的角色,它是视图和数据的桥梁,通过它的管理,将数据有 ...

  6. IOS App的生命周期

    文章目录 主函数main 应用程序的状态 应用程序的启动过程 应用程序从前台切换到后台 应用程序从后台切换到前台 响应中断 锁屏/解锁 app的生命周期和viewcontroller的生命周期 App ...

  7. 【iOS开发】-UIViewController加载过程和生命周期

    文章目录 前言 ViewController执行过程的探讨 ViewControllerOne 函数介绍 顺序引入 ViewControllerSecond引入 ViewControllerOne点击 ...

  8. iOS10 UI教程视图的生命周期

    iOS10 UI教程视图的生命周期 说到视图的生命周期一般都是指视图控制器的视图生命周期.在视图的声明周期中最主要的有8个方法,分别为loadView().viewDidLoad().viewWill ...

  9. iOS7应用开发5、视图控制器View Controller及其生命周期

    1.UITextView: 该类与Label类类似,可显示多行,可以编辑内容,可以滚动查看内容: 包含属性NSTextStorage *textStorage,该类是NSMutableAttribut ...

最新文章

  1. turtlebot机器人模拟平台
  2. redis实战:使用redis实现自动补全
  3. IDEA模块(module)的概念和使用_对比Eclipse
  4. java 分割数据_java 分割csv数据的实例详解
  5. 成功编译Webkit-cairo
  6. 如何为Kalman Studio编写T4模板
  7. mysql 启动必须加-h_Windows 安装 nginx,MySQL 等软件并加入系统服务启动详细
  8. .NET 配置系统未能初始化”异常
  9. Memcached详解
  10. 电商直播方案主要有哪些内容?
  11. 【组合数学】递推方程 ( 特解形式 | 特解求法 | 特解示例 )
  12. 我所经历的大数据平台发展史(三):互联网时代 • 上篇
  13. win 10 安装时候无法格式化分区,错误 0x80070057
  14. 如何使用hugo搭建个人博客(五):添加站内搜索(gcse)
  15. 【开始和MySQL做朋友】——初识MySQL
  16. AD2018快速设计想要尺寸的PCB板(AD2018如何修改PCB板子形状)
  17. 报表工具fastreport使用
  18. php 时间戳 周几,php时间戳怎么转换星期
  19. 正则表达式如何匹配电子邮箱?
  20. AI会取代人类劳动吗?

热门文章

  1. server端推送消息机制
  2. jstree 节点拖拽保存数据库
  3. 通过init-connect + binlog 实现MySQL审计功能
  4. ubuntu 添加用户、用户组
  5. Linux系统Shutdown命令定时关机详解
  6. 线程同步机制:互斥量、信号量、读写锁、条件变量
  7. testflight开发者已将您从测试计划中移除_使用 TestFlight 测?试 App
  8. linux菜单系统,Linux修改grub菜单
  9. 计算机如何学会自动地进行图像美学增强?
  10. 少儿编程150讲轻松学Scratch(十)-用scratch编程实现寻找素数