iOS浅析关于timer引起的内存泄漏

首先,说一下使用timer的误区,很多同学喜欢这样写:

_timer = [NSTimer scheduledTimerWithTimeInterval:.5 target:self
                                    selector:@selector(timerRun:)
                                    userInfo:nil
                                     repeats:YES];

然后在dealloc方法中释放timer:
- (void)dealloc {
[_timer invalidate];
_timer = nil;
}
最终结果就是dealloc方法不调用,timer和本类对象都无法释放,造成内存泄漏。
原因就是timer创建的时候target对self进行了强引用,而timer的释放依赖于本类对象的释放(即dealloc方法),造成循环引用。
解决这个最简单的方法就是,再添加一个实例方法:
- (void)invalidate{
if (_timer) {
[_timer invalidate];
timer = nil;
}
}
在释放之前主动调用一次,手动关闭timer(嫌麻烦的可以去网上找下自动关闭timer的方法,这里不做重点讲解)。

demo地址:https://github.com/wangzhaomeng/LLTimerTest

这里有个小demo,分别用NSTimer和GCD_timer实现了主线程和分线程的定时器。
觉得好,就给个star!

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

相关阅读更多精彩内容

  • 序言 目前形势,参加到iOS队伍的人是越来越多,甚至已经到供过于求了。今年,找过工作人可能会更深刻地体会到今年的就...
    Jack_lin阅读 78,829评论 110 1,946
  • 转自 iOS 面试常见问题最全梳理 序言 目前形势,参加到iOS队伍的人是越来越多,甚至已经到供过于求了。今年,找...
    ZMJun阅读 4,206评论 0 11
  • 文/Jack_lin(简书作者)原文链接:http://www.jianshu.com/p/5d2163640e2...
    笔笔请求阅读 3,693评论 0 0
  • OC的理解与特性 OC作为一门面向对象的语言,自然具有面向对象的语言特性:封装、继承、多态。它既具有静态语言的特性...
    小楼昨夜有风雨阅读 3,663评论 0 0
  • 原文 序言 目 前形势,参加到iOS队伍的人是越来越多,甚至已经到供过于求了。今年,找过工作人可能会更深刻地体会到...
    星空下的菜地阅读 8,268评论 3 42

友情链接更多精彩内容