接触ios开发已经两周了,按照公司给我安排新手学习任务一步一步接触。对于objective-c和iphone开发有了初步的认识和了解。
今天小领导在检查我提交的demo时提出了一个建议,建议我在viewController里面的dealloc函数中对属性和成员变量进行release。我很纳闷,为什么我已经在viewDidUnLoad中对这些成员和属性进行释放并置空了,此处还要进行release。这样不会导致成员变量的引用计数值为负数吗?小领导说这涉及到viewController的生命周期,因为有可能viewController根本就不会进入viewDidLoad中,那么也就不会调用viewDidUnLoad。如果日后有代码复用时可能就会出现问题。一知半解的感觉,于是查看apple的API,好好认识了一下时时刻刻都在打交道的viewController。
首先我们来了解一下什么是viewController。viewController叫做视图控制器。对内是用于管理视图,对外则是与其他的viewcontroller进行通信。它继承于NSObject。它分为两种类型,一种叫contentViewController,内容视图控制器,主要用于体现内容,如UITableView UIViewController这种直接显示内容的;还有一种叫做containerViewController,容器视图类。典型的就是tabBar,和navigation.它还包含好几个其它的viewController.
每个view都有一个viewController。且view的生命周期也在viewController里面。所以在view释放之前,viewcontroller是不可以释放的。那viewController的生命周期到底是怎么样的呢?和我一步一步来看吧。
step1:initWithNib viewController 会进行alloc,并init.
step2: loadView 在这里会看它的子类是否有重写这个函数,如果重写了则调用子类的,否则就调用她自己的。注意,这个时 候视图还是没有没加载进来的哦。
step3:viewDidLoad 这个时候视图已经存在了。可以在这里添加你想要添加的UI控件了。
step4:viewWillAppear 视图将出现在屏幕上了
step5:viewDidAppear 视图已经成功在屏幕上渲染完成了
step6:viewWillDisappear 视图将要消失了
step7:viewDidDisappear 视图从屏幕上消失了
step8:viewDidUnLoad 当发生内存警告的时候,如果本视图不是当前正在显示的视图,则会执行这个函数。将子视图释放。
目前iOS6.0之后,你不需要做任何以前viewDidUnload的事情,更不需要把以前viewDidUnload的代码移动到 didReceiveMemoryWarning方法中。
因为系统为你做了这件事。具体:
http://www.cocoachina.com/ios/20130520/6236.html
step9:dealloc 释放viewController
而view的生命周期则是step3_step8.
总结:
loadView和viewDidLoad的区别就是,loadView时view还没有生成,viewDidLoad时,view已经生成了,loadView只会被调用一次,而viewDidLoad可能会被调用多次(View可能会被多次加载),当view被添加到其他view中之前,会调用viewWillAppear,之后会调用viewDidAppear。当view从其他view中移除之前,调用viewWillDisAppear,移除之后会调用viewDidDisappear。当view不再使用时,受到内存警告时,ViewController会将view释放并将其指向为nil。
ViewController的生命周期中各方法执行流程如下:
init—>loadView—>viewDidLoad—>viewWillApper—>viewDidApper—>viewWillDisapper—>viewDidDisapper—>viewWillUnload->viewDidUnload—>dealloc
viewController在IOS开发中很重要,因为任何视图的操作都会涉及到它。我的理解暂时也还挺浅,希望在日后的学习中,不断加深对他的认识。也会不断在博客上分享自己的收获。