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. JavaMail发送邮件

    发送邮件包含的内容有: from字段  --用于指明发件人 to字段      --用于指明收件人 subject字段  --用于说明邮件主题 cc字段     -- 抄送,将邮件发送给收件人的同时抄 ...

  2. PHP安装

    工具 http://www.cnblogs.com/xiwang6428/p/4315049.html http://www.iteye.com/news/22672 1 安装:sudo apt-ge ...

  3. 【番外篇】ASP.NET MVC快速入门之免费jQuery控件库(MVC5+EF6)

    目录 [第一篇]ASP.NET MVC快速入门之数据库操作(MVC5+EF6) [第二篇]ASP.NET MVC快速入门之数据注解(MVC5+EF6) [第三篇]ASP.NET MVC快速入门之安全策 ...

  4. 多用多学之Java中的Set,List,Map

            很长时间以来一直代码中用的比较多的数据列表主要是List,而且都是ArrayList,感觉有这个玩意就够了.ArrayList是用于实现动态数组的包装工具类,这样写代码的时候就可以拉进 ...

  5. 自定义可视化调试工具(Microsoft.VisualStudio.DebuggerVisualizers)

    前言: 最近飞机失联的太多,明天要飞北京处理服务器双机热备的问题,航空保险已买,单号是:TF10122913. 至于我的银行卡密码,在我枕头下面的字条里,要是我之后没再更新文章,请通知我家人,哈哈哈哈 ...

  6. Entity Framework 6 Recipes 2nd Edition(12-1)译 -> 当SaveChanges( ) 被调用时执行你的代码

    第12章定制EF 在本章的小节里,定制实体对象和EF处理的一些功能.这些小节将涵盖很多”幕后”的事情,能让你的代码更加统一解决一些事情,比如用一个业务规则中心统一地为实体执行验证. 本章开始的小节,将 ...

  7. Lind.DDD.Plugins~插件模式的集成

    回到目录 对于Lind.DDD这个敏捷框架来说,插件也是其中的一个亮点,所有被认为是插件(Plugins)的模块都会继承自IPlugins这个标示接口,它在程序启动时会找到所有插件,并通过autofa ...

  8. WCF学习之旅—实现支持REST客户端应用(二十四)

    WCF学习之旅—实现REST服务(二十二) WCF学习之旅—实现支持REST服务端应用(二十三) 在上二篇文章中简单介绍了一下RestFul与WCF支持RestFul所提供的方法,及创建一个支持RES ...

  9. 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(16)-权限管理系统-漂亮的验证码

    系列目录 我们上一节建了数据库的表,但我发现很多东西还未完善起来,比如验证码,我们先做好验证码吧,验证码我们再熟悉不过了,为了防止恶意的登录,我们必须在登录页面加入验证码,下面我将分享一个验证码,这个 ...

  10. Living in the Matrix with Bytecode Manipulation--转

    原文地址:https://www.infoq.com/articles/Living-Matrix-Bytecode-Manipulation You are probably all too fam ...