• view的生命周期


    ViewController中包含 6个方法,管理着view的生命周期:

    loadView

    viewDidLoad

    viewWillAppear:

    viewDidAppear:

    viewWillDisappear:

    viewDidDisappear:

     

    调用时机

    loadView的调用时机为:当请求ViewController的view属相为nil时,会调用该方法,此时加载的view还只存在于内存当中,还未加入到应用的view层次中,访问view的superview属性等于nil

    viewDidLoad的调用时机:在loadView之后调用,可以做一些和view相关的初始化操作,但此时view未被加入到应用的view层次中,访问view的superview属性为nil

    viewWillAppear:的调用时机为:在view要被加到应用的view层次上之前调用,此时访问view的superview属性等于nil

    viewDidAppear:的调用时机为:在view加到应用的view层次上之后调用,此时可以访问view的superview属性

    viewWillDisappear:的调用时机为:在view要从应用的view层次上移除之前调用,此时可以访问view的superview属性

    viewDidDisappear:的调用时机为:在view已经从应用的view层次上移除之后调用,此时访问view的superview属性等于nil

     

    在上面的6个方法当中,调用的顺序是依次进行的,即loadView->viewDidLoad->viewWillAppear:->viewDidAppear:到此时,整个view已经可见,而如果view变得不可见,则是viewWillDisappear:->viewDidDisappear:。

    如果view不会从内存当中移除,那么loadView和viewDidLoad方法只会被调用一次,否则,比如由于系统内存不足的原因,或者由于ViewController的引用为0,导致ViewController从内存移除,从而导致其view也被移除,当再次访问ViewController的view属性时,由于其为nil,那么loadView和viewDidLoad会再次被调用。而剩下的viewWillAppear:,viewDidAppear:,viewWillDisappear:会由于视图的切换被调用多次(比如UINavigationController push一个ViewController进来,或者一个ViewController present 另一个ViewController,被遮挡的视图调用响应的disappear方法,新进来的视图调用相应的appear方法)

     

    是否调用super

    在上面6个方法中,只有loadView方法重写时不需要调用[super loadView]。原因是当我们重写loadView方法时,都会自己手动的为ViewController的view属性赋上自己创建的视图,而[super loadView]本身就会为ViewController的view属性创建一个视图(验证的方法就是我们可以重写loadView方法,在重写的方法里面没有任何语句,此时运行程序,发现模拟器的视图层次只有window没有view,而如果我们在重写的loadView里面只调用[super loadView],那么运行程序之后会发现视图层次中有了view),这样如果我们重写loadView调用[super loadView],虽然不会有错,但是会带来额外的开销。

  • 相关阅读:
    vue苦逼自学之路
    第一次博客作业
    u3d学习资料
    leetcode——Divide Two Integers
    leetcode——Swap Nodes in Pairs
    leetcode——Merge k Sorted Lists
    leetcode——Container With Most Water
    leetcode——Regular Expression Matching
    leetcode——Longest Palindromic Substring
    CC_CALLBACK之间的区别
  • 原文地址:https://www.cnblogs.com/chaoguo1234/p/5712306.html
Copyright © 2020-2023  润新知