【IOS】自定义View添加NSTimer导致不释放的问题

我们经常需要在自定义视图中添加动画.很多动画都需要用定时器实现.
但是如果我们在自定义view中添加定时器,如果不手动释放只是在

-(void)dealloc {
    [_timer invalidate];
}

这样写如果你打断点调试,就会发现,即使ViewController退出了,这个方法仍然不会释放.

也就是我们这个自定义的View永远不会被释放掉了.同样,这个定时器也会一直运行.

这个问题如果当时没有多想一下,很容易忽略,因为编译不会有任何问题和提示.

因为NSTImer 会强引用self——你的拥有NSTimer的那个view,因此形成了一个循环引用。只有在NSTimer invalidate之后才会释放self。

因此一种解决办法就是在ViewController的dealloc()里主动 invalidate一下view里的timer。

但是我觉得在viewController中去停止子视图中的Timer并不好, 不符合封装的思想.

所以我们可以在willMoveToSuperview:方法中停止定时器.

- (void)willMoveToSuperview:(UIView *)newSuperview {
    [super willMoveToSuperview:newSuperview];
    if (! newSuperview && self.timer) {
        // 销毁定时器
        [self.timer invalidate];
        self.timer = nil;
    }
}

运行之后发现,ViewController退出之后,view执行dealloc()方法
以后用到Timer的时候,千万记得要想想有没有忽略什么.
完美解决!

Demo地址:https://github.com/yuying2012/WJDStudyLibrary
这是一个大工程,请从工程中寻找相关模块代码.

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

相关阅读更多精彩内容

友情链接更多精彩内容