这个问题的关键在于 UIView 的生命周期。
- (void)didAddSubview:(UIView *)subview;
- (void)willRemoveSubview:(UIView *)subview;
- (void)willMoveToSuperview:(nullable UIView *)newSuperview;
- (void)didMoveToSuperview;
- (void)willMoveToWindow:(nullable UIWindow *)newWindow;
- (void)didMoveToWindow;
有兴趣的同学可以 自己验证一下 这些方法的调用顺序。
这里直接抛结论:
从上往下依次执行,但下面这四个方法比较特殊,调了两次。
- (void)willMoveToSuperview:(nullable UIView *)newSuperview;
- (void)didMoveToSuperview;
- (void)willMoveToWindow:(nullable UIWindow *)newWindow;
- (void)didMoveToWindow;
官方给出的解释是:
view的父类变化时,无论是添加还是移除,都是调用will和did两个方法。一次是add,一次是remove。带参数的will方法中,参数不为空是添加,为空时移除。
代码如下:
-(void)willMoveToWindow:(UIWindow *)newWindow{
if (!newWindow) {
if (_timer) {
[_timer invalidate];
_timer = nil;
}
}
}