转载自:http://blog.csdn.net/ishaoc/article/details/42172749
 
ViewController的加载顺序如下
 
从Stroyboard和xib中加载的ViewController的不同点在于
1、从Storyboard加载的ViewController只调用initWithCoder:方法,从xib加载的ViewController调用的是先执行initWithNibName:方法,后执行init方法。如果使用initWithNibName:方法初始化,则不会执行init方法;
2、从Storyboard里加载的ViewController,不能在initWithCoder:里面写self.view,而从xib里面创建的ViewController可以这么写。
3、对于不带xib的ViewController,只能使用init方法来进行初始化,使用initWithNibName:方法不能正常显示。使用init方法初始化的顺序如下:
 
log:
2014-12-26 15:36:07.857 St[269:9721] initWithNibName
2014-12-26 15:36:07.860 St[269:9721] init
2014-12-26 15:36:11.947 St[269:9721] viewDidLoad
2014-12-26 15:36:11.949 St[269:9721] viewWillAppear
2014-12-26 15:36:12.479 St[269:9721] viewDidAppear
 
 
 
*********************************
理论上,使用xib你的ViewController加载的顺序是按照上面写的顺序一样。没错,一点都没有错。
log:
2014-12-26 15:15:33.424 St[204:6297] initWithNibName
2014-12-26 15:15:33.431 St[204:6297] viewDidLoad
2014-12-26 15:15:33.432 St[204:6297] viewWillAppear
2014-12-26 15:15:33.966 St[204:6297] viewDidAppear
 
但是是,当你在initWithNibName方法里面用到了self.view的话,那么顺序可能就会有所变化了。
看一下log:
 
log:
2014-12-26 15:32:58.024 St[253:9015] initWithNibName
2014-12-26 15:32:58.025 St[253:9015] befroe self.view in init
2014-12-26 15:32:58.030 St[253:9015] viewDidLoad
2014-12-26 15:32:58.031 St[253:9015] after self.view in init
2014-12-26 15:32:58.034 St[253:9015] viewWillAppear
 
2014-12-26 15:32:58.565 St[253:9015] viewDidAppear
当我们用到self.view的时候,会优先执行loadView和viewDidLoad两个方法,这两个方法再执行剩下的init部分的操作(接下来就执行appear方法的内容,不再执行刚刚执行过的loadView和viewDidLoadView方法)。使用的过程当中还是要注意的。
 
(我去,辛苦做的内容,最后发现viewDidLoad方法的花括号把队形打乱了。。。。。。
 
 

一、 ARC环境

  • 单个viewController的生命周期

    • initWithCoder:(NSCoder *)aDecoder:(如果使用storyboard或者xib)
    • loadView:加载view
    • viewDidLoad:view加载完毕
    • viewWillAppear:控制器的view将要显示
    • viewWillLayoutSubviews:控制器的view将要布局子控件
    • viewDidLayoutSubviews:控制器的view布局子控件完成
      这期间系统可能会多次调用viewWillLayoutSubviews 、 viewDidLayoutSubviews 俩个方法
    • viewDidAppear:控制器的view完全显示
    • viewWillDisappear:控制器的view即将消失的时候
      这期间系统也会调用viewWillLayoutSubviews 、viewDidLayoutSubviews 两个方法
    • viewDidDisappear:控制器的view完全消失的时候
  • 多个viewControllers跳转
    • 当我们点击push的时候首先会加载下一个界面然后才会调用界面的消失方法
    • initWithCoder:(NSCoder *)aDecoder:ViewController2 (如果用xib创建的情况下)
    • loadView:ViewController2
    • viewDidLoad:ViewController2
    • viewWillDisappear:ViewController1 将要消失
    • viewWillAppear:ViewController2 将要出现
    • viewWillLayoutSubviews ViewController2
    • viewDidLayoutSubviews ViewController2
    • viewWillLayoutSubviews:ViewController1
    • viewDidLayoutSubviews:ViewController1
    • viewDidDisappear:ViewController1 完全消失
    • viewDidAppear:ViewController2 完全出现
  • 小结:
    -整个控制器声明周期: viewDidLoad -> viewWillAppear -> viewWillLayoutSubviews -> viewDidLayoutSubviews -> viewDidAppear -> viewWillDisappear -> viewDidDisappear

二、非ARC环境下

  • didReceiveMemoryWarning:

    • 当app收到内存警告的时候会发消息给视图控制器。
    • app从来不会直接调用这个方法,而是当系统确定可用内存不足的时候采取调用。
    • 如果你想覆写这个方法来释放一些控制器使用的额外内存,你应该在你的实现方法中调用父类的实现方法
  • viewWillUnload:(iOS6废除)
    • 当消除掉控制器的视图之前调用
    • 视图不会再在低内存条件下被清除所以这个方法不会再被调用。
    • 在iOS5之前,当低的内存情况发生的时候,当前控制器的视图们不再被需要的时候,系统会有选择性的将这些视图从这些内存移除。这个方法被调用的目的是在视图被真正的销毁前你可以执行一些清空的任务。比如,你想要使用这个方法去清空视图的观察者或通知或者记录视图的状态以便当重新读取的时候恢复。
    • 在iOS6之后,不再需要清空视图的引用。因此,其他一些关于清理的方法,比如清空观察者,也不是必要的了。
  • viewDidUnload:(iOS6废除)
    • 当视图从内存中被消除后调用
    • 视图在地的内存情况下不再被销毁所以这个方法也不再会调用
    • 在iOS5之前,地的内存状况发生之后,当前的试图控制器的视图不再被需要,系统会选择性的在视图控制器的视图被销毁后调用。这个方法使你执行一些最后清空任务的最后机会如果你的视图控制器存储着对视图的或子控件的单独引用,你应该使用这个方法去释放这些引用。你也可以使用这个方法去消除一些你再创建视图时候所创建的但是当视图不再的时候不再需要的关于对象的引用。你不应该使用这个方法去释放用户数据或者一些不能轻易被重新创建的数据。
    • 在iOS6之后,清空在试图控制器中对views和其他对象的引用已经没有必要了。
    • 当这个方法被调用的时候,视图的属性是空的。

ViewController加载顺序与self.view的更多相关文章

  1. WEB相关文件的加载顺序

    一. 1.启动一个WEB项目,WEB容器会先去读取它的配置文件web.xml,读取<context-param>和<listener>两个节点. 2.接着,容器创建一个Serv ...

  2. web相关文件加载顺序

    WEB相关文件的加载顺序   一. 1.启动一个WEB项目,WEB容器会先去读取它的配置文件web.xml,读取<context-param>和<listener>两个节点. ...

  3. web.xml加载顺序

    一 1.启动一个WEB项目的时候,WEB容器会去读取它的配置文件web.xml,读取<listener>和<context-param>两个结点. 2.紧急着,容创建一个Ser ...

  4. web.xml文件加载顺序

    1.启动一个WEB项目的时候,WEB容器会去读取它的配置文件web.xml,读取<listener>和<context-param>两个结点. 2.紧急着,容创建一个Servl ...

  5. web.xml 中的listener、 filter、servlet 加载顺序及其详解

    在项目中总会遇到一些关于加载的优先级问题,近期也同样遇到过类似的,所以自己查找资料总结了下,下面有些是转载其他人的,毕竟人家写的不错,自己也就不重复造轮子了,只是略加点了自己的修饰. 首先可以肯定的是 ...

  6. css样式加载顺序及覆盖顺序深入理解

    注:内容转载 很多的新手朋友们对css样式加载顺序和覆盖顺序的理解有所偏差,下面用示例为大家详细的介绍下,感兴趣的朋友不要错过 { height: 100%; width: 200; position ...

  7. Java---类加载机制,构造方法,静态变量,(静态)代码块,父类,变量加载顺序

    直接上代码: 代码1: public class ConstroctTest { private static ConstroctTest test = new ConstroctTest(); // ...

  8. DOM加载顺序

    最近一直在困扰dom的加载顺序问题,经常会遇到以为绑定好的事件不响应等情况,一头雾水,直到请教了周围的同事,才发现了解dom的加载顺序是多么的重要. 关于这个问题,其实网上已经有一些介绍,但是我觉得并 ...

  9. PHP 依赖注入,从此不再考虑加载顺序

    说这个话题之前先讲一个比较高端的思想--'依赖倒置原则' "依赖倒置是一种软件设计思想,在传统软件中,上层代码依赖于下层代码,当下层代码有所改动时,上层代码也要相应进行改动,因此维护成本较高 ...

随机推荐

  1. 第三十三节,sys解释器相关模块

    首先要引入import sys模块 sys.argv 功能:获取向脚本文件传入的参数,返回的列表,列表里的第一个元素是脚本文件路径和名称,后面的元素是传入的向脚本传入的参数 使用方法:sys.argv ...

  2. nodejs 命令篇

    1.npm init // 生成package.json 2.npm install --save-dev gulp-jslint // 安装gulp-jslint模块,并把模块名和版本保存到pack ...

  3. MyEclipse运行到断点也跳过的问题

    如果是B/S开发也就是javaWeb开发的话,Tomcat 的启动模式要设置成Debug模式 还有下面是没运行时断点的样子: 运行的时候,断点会变成对钩,表示执行到它所在代码的时候会停下来:

  4. MySQL 索引 总结

    1.索引的种类(六种) 普通索引,唯一索引,全文索引,单列索引,多列索引,空间索引 2.优缺点及注意事项 优点:有了索引,对于记录数量很多的表,可以提高查询速度. 缺点:索引是占用空间的,索引会影响u ...

  5. Redis配置文件 翻译 V3.2版本

    # Redis配置文件例子. # # 注意:为了能读取到配置文件,Redis服务必须以配置文件的路径作为第一个参数启动 # ./redis-server /path/to/redis.conf # 关 ...

  6. SSH自动断开连接的原因

    方法一: 用putty/SecureCRT连续3分钟左右没有输入, 就自动断开, 然后必须重新登陆, 很麻烦. 在网上查了很多资料, 发现原因有多种, 环境变量TMOUT引起,ClientAliveC ...

  7. 使用Chrome DevTools的Timeline和Profiles提高Web应用程序的性能

    来源: http://www.oschina.net/translate/performance-optimisation-with-timeline-profiles 我们都希望创建高性能的Web应 ...

  8. Django 用户认证及OneToOneField

    Django 用户认证如果自己不想写 就可以用django自带的认证 首选导入模块 models.py #!/usr/bin/env python #_*_ coding:utf8 _*_ from ...

  9. 超棒的自定义超酷滚动条jQuery插件 - Perfect Scrollbar

    可能大家厌倦了千篇一律的页面滚动条,如果你希望能够设计出与众不同的页面UI设计的话,Perfect ScrollBar可能就是你寻找的解决方案. 这个滚动条来自于一个个人项目,一个简单但是非常棒的滚动 ...

  10. VS2010+PCL+openni配置

    PCL中文论坛:http://www.pclcn.org/bbs/forum.php 1.安装 pcl 的完全安装包可以到: http://pointclouds.org/downloads/wind ...