UIView和UIViewController关联起来的生命周期

277 阅读1分钟

因为了解这些声明周期函数某些时候帮我们起到很巧妙的作用,所以这里可以记录下,作为一个开发手册必要时查看。 测试代码场景: 首先是新建了一个ViewLife(继承于UIView),然后ViewLife添加到控制器RACController中,创建了两个subview添加到ViewLife

  • push进入RACController时,得到的打印顺序如下:
-[RACController loadView]
-[RACController viewDidLoad]
-[ViewLife willMoveToSuperview:]参数newSuperview
-[ViewLife didMoveToSuperview]
-[ViewLife didAddSubview:]参数subview1
-[ViewLife didAddSubview:]参数subview2
-[RACController viewWillAppear:]
-[ViewLife willMoveToWindow:]参数newWindow
-[ViewLife didMoveToWindow]
-[ViewLife updateConstraints]
-[RACController updateViewConstraints]
-[RACController viewWillLayoutSubviews]
-[RACController viewDidLayoutSubviews]
-[ViewLife layoutSubviews]// view中的layoutSubviews设置的frame是最终的位置
-[ViewLife drawRect:]
-[RACController viewDidAppear:]

总结:

  • -> 加载控制器的View

  • -> ViewLife添加到superview

  • -> ViewLife的subview添加到ViewLife中

  • -> 控制器viewWillAppear

  • -> ViewLife添加到window

  • -> ViewLife约束更新

  • -> 控制器中view约束更新回调

  • -> 控制器layoutSubviews回调

  • -> ViewLife的layoutSubviews确定最终位置

  • -> view的drawRect决定最终显示

  • -> 控制器viewDidAppear

  • RACControllerpush到下一个VC时的打印

-[RACController viewWillDisappear:]
-[ViewLife willMoveToWindow:]参数=(null)
-[ViewLife didMoveToWindow]
-[ViewLife willMoveToWindow:]参数=newWindow
-[ViewLife didMoveToWindow]
-[ViewLife willMoveToWindow:]参数=(null)
-[ViewLife didMoveToWindow]
-[RACController viewDidDisappear:]

总结:

  • -> 调用viewWillDisappear

  • -> 从window中移除自身view并调用willMoveToWindow和didMoveToWindow

  • -> 将自身再加入到window中并调用willMoveToWindow和didMoveToWindow

  • -> 从window中移除自身view并调用willMoveToWindow和didMoveToWindow

  • -> 调用viewDidDisappear

  • pop退出RACController时,得到的打印顺序如下:

-[RACController viewWillDisappear:]
-[ViewLife willMoveToWindow:]参数=(null)
-[ViewLife didMoveToWindow]
-[RACController viewDidDisappear:]
-[RACController dealloc]
-[ViewLife willMoveToSuperview:]参数=(null)
-[ViewLife didMoveToSuperview]
-[ViewLife removeFromSuperview]
-[ViewLife dealloc]
-[ViewLife willRemoveSubview:]参数=subview1
-[ViewLife willRemoveSubview:]参数=subview2

总结:

  • -> 控制器viewWillDisappear
  • -> ViewLife从window中移除
  • -> 控制器viewDidDisappear
  • -> 控制器dealloc
  • -> ViewLife从superview中移除
  • -> ViewLife执行dealloc
  • -> subview从ViewLife中移除并执行dealloc