nstimer循环引用_NSTimer循环引用的问题

前言:

记得之前看过一个面试题问:ARC环境下的dealloc方法有什么用?问题解答是:代理指针置空,停止定时器timer,注销通知,释放掉实例变量。看着没什么问题,而且网上一收也是大概这样的答案。今天算是被实实在在的坑了一把,唉,其实说是被坑不如说是自己对定时器NSTimer没有一个足够的认识,我们总是习惯性的看着别人给好的答案而懒得去看API文档仔细分析。

定时器NSTimer:

最近做的一个公司项目有一个需求,当你进入到某一个视图控制器中定时器timer开始启动并在1秒内触发timerAction:方法。然后在视图控制器中销毁的时候停止定时器。于是乎:

>

self.mytimer= [NSTimerscheduledTimerWithTimeInterval:1target:weakSelf selector:@selector(timerAction:) userInfo:nilrepeats:YES];

[[NSRunLoopcurrentRunLoop] addTimer:self.mytimerforMode:NSRunLoopCommonModes];

> #**并且在dealloc方法里面销毁定时器**

-(void)dealloc

{

[self.mytimerinvalidate];

//   别忘了把定时器置为nil,否则定时器依然没有释放掉的

self.mytimer= nil;

}

一切看起来都是很安好没有什么不妥的地方,但是平静的湖面上就隐藏者巨大的风险。当跳转到其他页面的时候定时器还一直在输出,这时就纳闷了。在dealloc的打断点发现dealloc根本不执行,想想自己对定时器的处理是根据面试题中的答案难不成是自己在哪里犯二了。后来仔细一分析问题的关键在于timer对target进行了强引用,在这里也就是对self进行了强引用,导致页面要销毁的时候不会执行dealloc方法。既然是被强引用了就应该使用__weak,所以:

__weaktypeof(self) weakSelf = self;

self.mytimer= [NSTimerscheduledTimerWithTimeInterval:1target:weakSelf selector:@selector(timerAction:) userInfo:nilrepeats:YES];

但是有没使用__weak修饰的差别在于self有没被释放掉而已,self则一直被timer强引用着。

最后发现一个很简单的解决方法就是在

-(void)viewDidDisappear:(BOOL)animated或者

-(void)viewWillDisappear:(BOOL)animated  中停止定时器停止并把定时器置为nil就可以解决问题。

与其说是自己被坑不如说是对它认识的不足,对网上很多人的答案都坚信不疑,才会使自己一开始就陷入错误

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值