因为了解这些声明周期函数某些时候帮我们起到很巧妙的作用,所以这里可以记录下,作为一个开发手册必要时查看。
测试代码场景:
首先是新建了一个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
-
由
RACController
push到下一个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