NSTimer销毁时遇到的坑

NSTimer是iOS常用的定时器,但是销毁却是一件麻烦的事情。

self.timer = [NSTimer scheduledTimerWithTimeInterval:0.2 target:self selector:@selector(showTimer:) userInfo:nil repeats:YES];

这段代码是常用的创建NSTimer的方式,并把timer添加到Runloop中,但是如何销毁它呢?网上给的解决方案是如下几种
方案一

- (void)dealloc {  
    if ([self.timer isValid]) {  
        [self.timer invalidate];  
        self.timer = nil; 
    }
}

方案二

//页面将要进入前台,开启定时器
-(void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
    //开启定时器
    [self.timer setFireDate:[NSDate distantPast]];
}

//页面消失,进入后台不显示该页面,关闭定时器
-(void)viewDidDisappear:(BOOL)animated
{
    [super viewDidDisappear:animated];
    //关闭定时器
    [self.timer setFireDate:[NSDate distantFuture]];
}

方案三
方案一和方案二组合

但是亲测三种方案均不能销毁timer,原因如下图所示

image.png

VC强引用timer,timer的target强引用vc,造成循环引用,因此不能释放

那么应该如何销毁timer呢?打破循环引用就可以,即timer的target不要是self即可。有兴趣的读者可以试试看。

图片引用自https://www.jianshu.com/p/d8fdaf04cad6

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

相关阅读更多精彩内容

  • 概述 RunLoop作为iOS中一个基础组件和线程有着千丝万缕的关系,同时也是很多常见技术的幕后功臣。尽管在平时多...
    sumrain_cloud阅读 1,003评论 0 5
  • 之前要做一个发送短信验证码的倒计时功能,打算用NSTimer来实现,做的过程中发现坑还是有不少的。 基本使用 NS...
    WeiHing阅读 4,463评论 1 8
  • 1. 什么是NSTimer   官方的解释“A timer provides a way to perform a...
    Timir阅读 952评论 0 3
  • 引言 NSTimer内存泄漏真的是因为vc与timer循环引用吗?不是! 小伙伴们都知道,循环引用会造成内存泄漏,...
    01_Jack阅读 1,409评论 5 10
  • 一整天脑子混沌,想写一些东西又无从下手,回到家赖在床上后,冲进寒冷的黑夜刷完圈,脑子才算清晰起来。决定就谈一下人事...
    一颗星火阅读 138评论 0 0

友情链接更多精彩内容