zoukankan      html  css  js  c++  java
  • init,loadView, viewDidLoad,nil

    init方法

    在init方法中实例化必要的对象(遵从LazyLoad思想)init方法中初始化ViewController本身

    loadView方法

    view controller会在view的property被请求并且当前view值为nil时调用这个函数

    当view需要被展示而它却是nil时,viewController会调用该方法。不要直接调用该方法。

    如果手工维护views,必须重载重写该方法

    如果使用IB维护views,必须不能重载重写该方法

    这个方法的默认实现是这样:先寻找有关可用的nib文件的信息,根据这个信息来加载nib文件,如果没有有关nib文件的信息,默认实现会创建一个空白的UIView对象,然后让这个对象成为controller的主view。
    所以,重载这个函数时,你也应该这么做。并把子类的view赋给view属性(property)(你create的view必须是唯一的实例,并且不被其他任何controller共享),而且你重载的这个函数不应该调用super
    如果你要进行进一步初始化你的views,你应该在viewDidLoad函数中去做。在iOS 3.0以及更高版本中,你应该重载viewDidUnload函数来释放任何对view的引用或者它里面的内容(子view等等)。

    仅仅应该在开发者希望自行通过编码而不是Interface Builder定制view的时候被实现,而且不应该在其中调用[super loadView],你的loadView中应该有self.view = …这样的行为。

    如果仅仅是想要在当前view上增加一些UIButton或是UILabel,应该在viewDidLoad里去做

     

    如果你在控制器中实现了loadView方法,那么你可能会在应用运行的某个时候被内存管理控制调用。 如果设备内存不足的时候, view 控制器会收到didReceiveMemoryWarning的消息。 默认的实现是检查当前控制器的view是否在使用。如果它的view不在当前正在使用的view hierarchy里面,且你的控制器实现了loadView方法,那么这个view将被release, loadView方法将被再次调用来创建一个新的view。 

     

    所以流程应该是这样:
    (loadView/nib文件)来加载view到内存 ——>viewDidLoad函数进一步初始化这些view ——>内存不足时,调用viewDidUnload函数释放views
    —->当需要使用view时有回到第一步
    如此循环

     

    viewDidLoad方法

    viewDidLoad 此方法只有当view从nib文件初始化的时候才被调用。

     

    重载重写该方法以进一步定制view

    在iPhone OS 3.0及之后的版本中,还应该重载重写viewDidUnload来释放对view的任何索引

     

     

    viewDidUnload方法

    当系统内存吃紧的时候会调用该方法(注:viewController没有被dealloc)

    内存吃紧时,在iPhone OS 3.0之前didReceiveMemoryWarning是释放无用内存的唯一方式,但是OS 3.0及以后viewDidUnload方法是更好的方式

    在该方法中将所有IBOutlet(无论是property还是实例变量)置为nil(系统release view时已经将其release掉了)

     

    在该方法中释放其他与view有关的对象、其他在运行时创建(但非系统必须)的对象、在viewDidLoad中被创建的对象、缓存数据等 release对象后,将对象置为nil(IBOutlet只需要将其置为nil,系统release view时已经将其release掉了)

     

     

    一般认为viewDidUnload是viewDidLoad的镜像,因为当view被重新请求时,viewDidLoad还会重新被执行在viewDidUnload中被release的对象(必须是很容易被重新创建的对象(比如在viewDidLoad或其他方法中创建的对象)),不要release用户数据或其他很难被重新创建的对象

     

     

    awakeFromNib

    这个方法是一个类在IB中被实例化是被调用的.看了帖子发现大家都推荐使用viewDidLoad而不要使用 awakeFromNib,应为viewDidLoad会被多次调用,awakeFromNib只会当从nib文件中unarchive的时候才会被调 用一次.实际测试中发现,当一个类的awakeFromNib被调用的时候,那么这个类的viewDidLoad就不会被调用了,这个感觉很奇怪.

     

    initWithCoder

    是一个类在IB中创建但在xocdde中被实例化时被调用的.比如,通过IB创建一个controllernib ,然后在xocde中通过initWithNibName来实例化这个controller,那么这个controller initWithCoder会被调用.

    viewWillAppear:方法更新准备显示的视图的信息。调用时,视图可能还没有被加载。
    使用viewDidAppear:来触发视图完全显示在屏幕上之后的行为,例如任何动画。

     

    nil是空的意思。相当于NULL。nil表示一个Objctive-C对象,这个对象的指针指向空(没有东西就是空)。 
    首字母大写的Nil和nil有一点不一样,Nil定义一个指向空的类(是Class,而不是对象)。 
    在Objective-C里,nil对象被设计来跟NULL空指针关联的。他们的区别就是nil是一个对象,而NULL只是一个值
    在Objective-C中,你来对象在功能上等价于其他很多语言中的NULL指针。区别是可以对nil调用方法,而不致导致程序崩溃或抛出异常。

    四、模拟器的调用顺序

     

    我构架了这样一个环境,在该环境中有两个viewController,姑且命名为A和B,tag分别为1和2,A控制程序启动的时候即加载的界面,在A中放一个按钮,按下后会通过segue来调用到界面B;B 中页放一个按钮,通过执行

     

    [self dismissModalViewControllerAnimated:YES];

     

    来返回界面A

     

    然后检测所有的函数调用,依次如下

     

    加载A的时候依次调用

     

    1 initWithCoder

     

    1 loadView //如果说你进行了重写,会在这里调用,这一步可以参考下文

     

    1 viewDidLoad

     

    1 viewWillAppear

     

    1 viewWillLayoutSubviews

     

    1 viewDidLayoutSubviews

     

    1 viewDidAppear

     

    切换至B的时候依次调用

     

    2 initWithCoder             //先将2初始化

     

    1 prepareForSegue       //调用1的准备过度的函数,所以在该函数中可以对界面B的一些相关属性进行赋值

     

    2 loadView    //如果这里进行了重写

     

    2 viewDidLoad              //2界面加载

     

    1 viewWillDisappear

     

    2 viewWillAppear

     

    2 viewWillLayoutSubviews

     

    2 viewDidLayoutSubviews

     

    2 viewDidAppear

     

    1 viewDidDisappear

     

    从B切换回A的时候依次调用

     

    2 viewWillDisappear

     

    1 viewWillAppear

     

    1 viewDidAppear

     

    2 viewDidDisappear

     

    2 dealloc

     

    顺序总结下来加载依次为:加载 - 显示 - 布局

     

    完成顺序依次为:完成布局 - 完成显示  - 完成加载

  • 相关阅读:
    Spring MVC 核心组件详解
    Spring MVC 入门就这一篇
    Spring 事务解决方案
    【UGUI源码分析】Unity遮罩之Mask详细解读
    游戏开发中不同时区下的时间问题
    ARTS第十三周(阅读Tomcat源码)
    Win10 电脑安装.NET低版本提示“这台计算机中已经安装了 .NET Framwork 4.6.2或版本更高的更新”问题
    Dynamics 365 Setup 提示SqlServer 存在
    Dynamics CRM "Verification of prerequisites for Domain Controller promotion failed. Certificate Server is installed."
    Dynamics CRM
  • 原文地址:https://www.cnblogs.com/PressII/p/3746088.html
Copyright © 2011-2022 走看看