如何在UIView中正确地移除定时器NSTimer

这个问题的关键在于 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;
        }
    }
}

你可能感兴趣的:(如何在UIView中正确地移除定时器NSTimer)