如何在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;
        }
    }
}
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容