关于UIView和UIViewController的生命周期

由于控制器的初始化方式不同,触发的函数略有不同。
如果控制器是直接通过代码或者XIB创建出来的,并且调用方法为[[ViewController alloc] init]创建VC的生命周期为:

-[ViewController initWithNibName:bundle:]
-[ViewController init]
-[ViewController loadView]

如果是通过Storyboard创建的控制器,那么VC的生命周期为:

-[ViewController initWithCoder:]
-[ViewController awakeFromNib]
-[ViewController loadView]

ViewController在loadView函数之后,函数的调用顺序如下:

// 视图控制器开始加载
loadView// 决定当前控制器的根视图是什么,如果不主动设置,控制器会自动创建一个UIView作为根视图
viewDidLoad
viewWillAppear
viewDidAppear
// 视图消失时
viewWillDisappear
viewDidDisappear
// 当收到内存警告时
didReceiveMemoryWarning
viewDidUnload
// 如果收到内存警告视图被释放了后,再次显示此页面时,会再次从loadView开始调用
// 控制销毁时
dealloc

loadView详解:苹果设计这个方法就是给我们自定义UIViewController的view用的。在view创建完毕后,最终都会调用viewDidLoad方法。一般我们会在这里做界面上的初始化操作,比如往view中添加一些子视图、从数据库或者网络加载模型数据装配到子视图中。当发出内存警告调用viewDidUnload方法时,只是释放了view,并没有释放UIViewController,所以并不会调用dealloc方法。即viewDidUnload和dealloc方法并没有任何关系,dealloc方法只会在UIViewController被释放的时候调用。
流程表示如下:

  1. 第一次访问UIViewController的view时,view为nil,然后就会调用loadView方法创建view
  2. view创建完毕后会调用viewDidLoad方法进行界面元素的初始化
  3. 当内存警告时,系统可能会释放UIViewController的view,将view赋值为nil,并且调用viewDidUnload方法
  4. 当再次访问UIViewController的view时,view已经在3中被赋值为nil,所以又会调用loadView方法重新创建view
  5. view被重新创建完毕后,还是会调用viewDidLoad方法进行界面元素的初始化

3.1 谈谈UIView的生命周期。

如果纯代码创建UIView,调用方式为[[UIView alloc] init]那么它的生命周期为:

-[UIView initWithFrame:]
-[UIView init]
-[UIView layoutSubviews]

如果纯代码创建UIView,调用方式为[[UIView alloc] initWithFrame:frame]那么它的生命周期为:

-[UIView initWithFrame:]
-[UIView layoutSubviews]

如果通过XIB创建UIView,调用方式为[[[NSBundle mainBundle] loadNibNamed:@"CustomView" owner:nil options:nil] lastObject]那么它的生命周期为:

-[CustomView initWithCoder:]
-[CustomView awakeFromNib]
-[CustomView layoutSubviews]
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容