iOS SDK中提供很多原生的ViewController,大大提高了我们的开发效率;那么下面我们就根据开发中我们常用的ViewController谈一谈它的生命周期;

(一)按照结构和用法可以对iOS的所有ViewController分成两类:

  1、主要用于展示内容的ViewController;如UITableViewController,UIViewController,这种ViewController主要为用户展示应用的内容,并提供与用户交互。

  2、用于控制和显示其他ViewController的ViewController;如UINavigationController,UITabbarController,这种ViewController一般都是ViewController的容器或者控制器;他们都有一个属性viewControllers(其中:①UINavigationController表示一种Stack式结构,push一个ViewController或者pop一次ViewController,所以一般后一个ViewController一般都会依赖前一个ViewController;②而UITabbarController表示一个Array式结构,各个ViewController之间是并列的)。

(二)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生命周期中有那么多函数,那么代码该写在那个函数里面更好呢:

  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);

  4、viewWillAppear 这个一般在view被添加到superview之前;切换动画之前调用,在这里可以进行一些显示前的处理,比如键盘弹出,一些特殊的过程动画;

  5、viewDidAppear 一般用于显示后;在切换动画后,如果有需要的操作,可以在这里加入相关代码;

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

(以上便是对ViewController生命周期的相关介绍和理解,还希望大家相互补充共同进步)

iOS - ViewController的生命周期的更多相关文章

  1. ios ViewController的生命周期分析和基本使用逻辑

    按结构可以对iOS的所有ViewController分成两类:1.主要用于展示内容的ViewController,这种ViewController主要用于为用户展示内容,并与用户交互,如UITable ...

  2. iOS view和viewController的生命周期

    一.ViewController的职责 对内管理与之关联的View,对外跟其他ViewController通信和协调.对于与之关联的View,ViewController总是在需要的时候才加载视图,并 ...

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

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

  4. View和viewController的生命周期

    View和viewController的生命周期 一.ViewController的职责 对内管理与之关联的View,对外跟其他ViewController通信和协调.对于与之关联的View,View ...

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

    目录[-] iOS对UIViewController生命周期和属性方法的解析 一.引言 二.UIViewController的生命周期 三.从storyBoard加载UIViewController实 ...

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

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

  7. ViewController的生命周期

    # ViewController 的生命周期 # ViewController的生命周期中各个方法的流程如下: init loadView :加载view viewDidLoad :view加载完毕 ...

  8. (转)iOS应用程序生命周期(前后台切换,应用的各种状态)详解

    原文:http://blog.csdn.net/totogo2010/article/details/8048652 iOS应用程序生命周期(前后台切换,应用的各种状态)详解         分类:  ...

  9. 转:iOS应用程序生命周期(前后台切换,应用的各种状态)详解

    iOS应用程序生命周期(前后台切换,应用的各种状态)详解 分类: iOS开发进阶2012-10-08 15:35 42691人阅读 评论(30) 收藏 举报 iosapplication任务anima ...

随机推荐

  1. [Xamarin] 透過Native Code呼叫 JavaScript function (转帖)

    今天我們來聊聊關於如何使用WebView 中的Javascript 來呼叫 Native Code 的部分 首先,你得先來看看這篇[Xamarin] 使用Webview 來做APP因為這篇文章至少講解 ...

  2. 【完全开源】知乎日报UWP版:项目结构说明、关键源代码解释

    目录 说明 项目结构 关键代码 演示视频 说明 上一篇博客将源码放出来了,但是并没有做过多的介绍,所以如果自己硬看可能需要花费很长的时间,尤其这些代码并不是自己写的.项目不算复杂但是也不算简单,这篇文 ...

  3. Fedora 22中的DNF软件包管理工具

    Introduction DNF is the The Fedora Project package manager that is able to query for information abo ...

  4. 小丁带你走进git世界五-远程仓库

    一.文件,指令讲解 首先讲一下远程仓库和本地仓库在文件上面的区别,首先我们来看下对比图(当然这里说的区别是在于.git文件下面的文件内容,至于里面内容我们不会关注)這裡我们进行了相同的操作就是本地仓库 ...

  5. 使用 Code Snippet 简化 Coding

    在开发的项目的时候,你是否经常遇到需要重复编写一些类似的代码,比如是否经常会使用 for.foreach ? 在编写这两个循环语句的时候,你是一个字符一个字符敲还是使用 Visual Studio 提 ...

  6. Entity Framework 6 Recipes 2nd Edition(11-2)译 -> 用”模型定义”函数过滤实体集

    11-2. 用”模型定义”函数过滤实体集 问题 想要创建一个”模型定义”函数来过滤一个实体集 解决方案 假设我们已有一个客户(Customer)和票据Invoice)模型,如Figure 11-2所示 ...

  7. Entity Framework 6 Recipes 2nd Edition(12-5)译 -> 自动删除相关联实体

    12-5. 自动删除相关联实体 问题 当一个实体被删除时,你想自动删除它相关联的实体 解决方案 假设你有一个表结构由一个course (科目), course 的classes (课程),以及enro ...

  8. is和as

    一.明确两个基本概念 隐式转换: a.对于值类型,低精度=>高精度.eg:int=>long b.对于引用类型,子类向祖宗类转换过程.eg:对象=>Object 显式转换:显示转换是 ...

  9. 原生ajax实现登录(一部分代码)

        <script type="text/javascript">          function ajax() {          //先声明一个异步请求对 ...

  10. 解析大型.NET ERP系统核心组件 查询设计器 报表设计器 窗体设计器 工作流设计器 任务计划设计器

    企业管理软件包含一些公共的组件,这些基础的组件在每个新项目立项阶段就必须考虑.核心的稳定不变功能,方便系统开发与维护,也为系统二次开发提供了诸多便利.比如通用权限管理系统,通用附件管理,通用查询等组件 ...