每个view都有一个viewController。且view的生命周期也在viewController里面。所以在view释放之前,viewcontroller是不可以释放的。那viewController的生命周期到底是怎么样的呢?和我一步一步来看吧。
【2016-04-28 14:27:01.622 VCAndView[1317:144026] loadView
2016-04-28 14:27:01.623 VCAndView[1317:144026] viewDidLoad
2016-04-28 14:27:01.627 VCAndView[1317:144026] viewWillAppear
2016-04-28 14:27:01.629 VCAndView[1317:144026] viewWillLayoutSubviews
2016-04-28 14:27:01.630 VCAndView[1317:144026] viewDidLayoutSubviews
2016-04-28 14:27:01.631 VCAndView[1317:144026] viewDidAppear
】
step1:initWithNib viewController 会进行alloc,并init.
step2: loadView 在这里会看它的子类是否有重写这个函数,如果重写了则调用子类的,否则就调用她自己的。注意,这个时 候视图还是没有没加载进来的哦。
【// loadView 进行如下操作:
//
// 如果你重载了这个函数,你应该自己创建必要的views并且将一个非nil值赋给view属性
//
// 如果你没有重载这个函数,默认实现会使用controller的nibName 和 nibBundle属性来尝试从nib文件加载view。如果没有找到nib文件,它尝试寻找一个与view controller类名匹配(viewControllerClassName.nib)的nib文件。
//
// 如果没有可用的nib文件,那么它创建一个空的UIView作为它的view。】
step3:viewDidLoad 这个时候视图已经存在了。可以在这里添加你想要添加的UI控件了。
【//
// Allocating or loading data to be displayed in your view
//
// 这时候view已经有了,最适合创建一些附加的view和控件了。有一点需要注意的是,viewDidLoad会调用多次(viewcontroller可能多次载入view,参见图2)。】
step4:viewWillAppear 视图将出现在屏幕上了
【// 这个一般在view被添加到superview之前,切换动画之前调用。在这里可以进行一些显示前的处理。比如键盘弹出,一些特殊的过程动画(比如状态条和navigationbar颜色)。】
step5:viewDidAppear 视图已经成功在屏幕上渲染完成了
【viewDidAppear/viewWillLayoutSubviews/viewDidLayoutSubviews方法中修改frame才能产生效果。才能实现代码控制frame来横竖屏适应】
step6:viewWillDisappear 视图将要消失了
step7:viewDidDisappear 视图从屏幕上消失了
step8:viewDidUnLoad 当发生内存警告的时候,如果本视图不是当前正在显示的视图,则会执行这个函数。将子视图释放。
step9:dealloc 释放viewController
而view的生命周期则是step3_step8.