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],虽然不会有错,但是会带来额外的开销。