美文网首页
UIViewController生命周期

UIViewController生命周期

作者: 香菜那么好吃为什么不吃香菜 | 来源:发表于2020-07-26 21:53 被阅读0次

    先上一张大家再熟悉不过的图片(虽然高糊)


    image.png

    这个图基本上就把UIViewController常用的这几个方法的执行顺序说的很清晰了。下面我再废话一下~

    常用方法的作用

    init

    实例初始化方法,用代码对view进行初始化,会调用此方法。

    loadView

    在UIViewController对象的view被访问并且为空的时候调用。但是你不应该手动调用他,系统在需要的时候会自动调用的,他会加载或创建一个view并把它赋值给UIViewController的view属性。
    但是loadView有没有可能在VC生命周期内被多次调用呢?那确实是有可能的~
    如果我们在处理内存警告时释放view属性:self.view = nil,如果之后再访问view就会再次调用loadView。
    如果想通过代码来创建UIViewController的view,就要重写loadView方法,并且不需要调用[super loadView],第三点已经提到若没有xib文件, [super loadView]默认创建一个空白的UIView。我们既然要通过代码来自定义UIVIew,那么就没必要事先创建一个空白的UIView,以节省不必要的开销。当然调用了也不会出错,只是造成不必要开销。

    viewDidLoad

    类的成员对象和变量的初始化我们都会放在这个方法中,在类创建后,无论视图的展现与消失,只会在将要布局时调用一次。
    当loadView将view载入内存中,会调用viewDidLoad方法来进一步设置。此时,视图层次已经存放到内存中,通常我们对于各种初始化数据的载入、初始设定、修改约束、移除视图等很多操作都可以在这个方法中实现。

    视图层次(view hierachy):因为每个视图都有自己的子视图,这个子视图层次其实也可以理解为一棵树。树的根节点也就是根视图(root view)。在UIViewController中的view属性,它可以看做是其他所有子视图的容器。

    viewWillAppear

    视图将要展现的时候会调用。
    系统在载入所有数据的时候,将会在屏幕上显示视图,这时会先调用这个方法,通常我们会在这个方法对即将显示的view做进一步的设置。比如:设置设备在不同方向时该如何显示,设置状态栏方向啊、设置视图显示样式啊。还有就是,当一个app有多个视图的时候,上下级视图切换也会调用这个方法,如果在调入视图时,需要对数据做更新,就只能在这个方法内实现。

    viewDidAppear

    视图完成显示时调用
    在view被添加到视图层级中以及多视图,上下级视图企鹅二环时调用这个方法,在这里可以对正在显示的视图做进一步的设置。

    viewWillDisappear

    视图即将消失时调用
    在视图切换时,当前视图在即将被移除或者被覆盖时,会调用该方法,但此时还没有调用removeFromSuperView。

    viewDidDisappear

    视图已经消失时调用
    view已经消失或被覆盖,此时以调用removeFromSuperView。

    dealloc

    VC被释放的时候调用
    视图被销毁,此时需要对你init和viewDidLoad中创建的对象进行释放。

    didRecieveMemoryWarning

    先上图


    image.png

    IOS下每个app可用的内存是被限制的,如果一个app使用的内存超过了这个阀值,则系统就会向该app发送Memory Warning消息。收到消息后,appa必须尽可能多的释放一些不必要的内存,否则ios会关闭app。
    当app的VC收到Memory Waring后,默认的实现时检查当前控制器的view是否在使用,如果不使用,就置为nil.

    IOS6之后是不会调用unload的。

    -(void)didReceiveMemoryWarning
    {
    [super didReceiveMemoryWarning];//即使没有显示在window上,也不会自动的将self.view释放。
    // Add code to clean up any of your own resources that are no longer necessary.
    // 此处做兼容处理需要加上ios6.0的宏开关,保证是在6.0下使用的,6.0以前屏蔽以下代码,否则会在下面使用self.view时自动加载viewDidLoad
    if ([self.view window] == nil)// 是否是正在使用的视图
    {
    // Add code to preserve data stored in the views that might be
    // needed later.
    // Add code to clean up other strong references to the view in
    // the view hierarchy.
    self.view = nil;// 目的是再次进入时能够重新加载调用viewDidLoad函数。
    }
    }
    

    相关文章

      网友评论

          本文标题:UIViewController生命周期

          本文链接:https://www.haomeiwen.com/subject/qfytrktx.html