美文网首页
NSTimer 定时器销毁

NSTimer 定时器销毁

作者: follow_er | 来源:发表于2017-08-30 15:01 被阅读491次

前言:
记得之前看过一个面试题问:ARC环境下的dealloc方法有什么用?问题解答是:代理指针置空,停止定时器timer,注销通知,释放掉实例变量。看着没什么问题,而且网上一收也是大概这样的答案。今天算是被实实在在的坑了一把,唉,其实说是被坑不如说是自己对定时器NSTimer没有一个足够的认识,我们总是习惯性的看着别人给好的答案而懒得去看API文档仔细分析。
定时器NSTimer:
最近做的一个公司项目有一个需求,当你进入到某一个视图控制器中定时器timer开始启动并在1秒内触发timerAction:方法。然后在视图控制器中销毁的时候停止定时器。于是乎:

self.mytimer = [NSTimer scheduledTimerWithTimeInterval:1 target:weakSelf selector:@selector(timerAction:) userInfo:nilrepeats:YES];
 // 若在主线程不用调用这句话    
 [[NSRunLoop currentRunLoop] addTimer:self.mytimer forMode:NSRunLoopCommonModes];
 **并且在dealloc方法里面销毁定时器**
-(void)dealloc {
      [self.mytimer invalidate];
//   别忘了把定时器置为nil,否则定时器依然没有释放掉的
      self.mytimer  = nil;
  }

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

__weak typeof(self) weakSelf = self;
   self.mytimer = [NSTimer scheduledTimerWithTimeInterval:1 target:weakSelf selector:@selector(timerAction:) userInfo:nilrepeats:YES];

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

最后发现一个很简单的解决方法就是在
-(void)viewDidDisappear:(BOOL)animated或者
-(void)viewWillDisappear:(BOOL)animated 中停止定时器停止并把定时器置为nil就可以解决问题。
与其说是自己被坑不如说是对它认识的不足,对网上很多人的答案都坚信不疑,才会使自己一开始就陷入错误

相关文章

  • NSTimer 定时器销毁

    前言:记得之前看过一个面试题问:ARC环境下的dealloc方法有什么用?问题解答是:代理指针置空,停止定时器ti...

  • NSTimer销毁时遇到的坑

    NSTimer是iOS常用的定时器,但是销毁却是一件麻烦的事情。 这段代码是常用的创建NSTimer的方式,并把t...

  • iOS使用WKWebView不调用dealloc

    1、使用了定时器,NSTimer没有销毁 2、delegate属性使用weak、asign修饰符 3、block使...

  • 关于NSTimer的事,cell 中含有倒计时

    1.在项目中遇到过开启NSTimer事件后 控制器不销毁 不走dealloc 方法,以至于 不能销毁掉定时器,那我...

  • NSTimer定时器的销毁

    定时器的销毁 1、如果是在VC中创建的定时器,需要在dealloc方法中销毁 2、有时会自定义View,并且在这个...

  • 如何释放Cell中的NSTimer

    问题 Cell中使用了NSTimer做倒计时功能,在Cell的dealloc方法中销毁定时器[self.timer...

  • iOS从timer释放问题看内存管理

    在iOS的开发中,如果使用NSTimer做定时器,一定要在合适的时机销毁这个定时器,不然可能导致内存得不到释放。原...

  • 无标题文章

    iOS NSTimer使用详解-开启、关闭、移除 定时器定时器详解ios定时器关闭定时器NSTimer 1、要使用...

  • OC定时器

    定时器方法 NSTimer * timer=[NSTimer timerWithTimeInterval:2.0 ...

  • 定时器的使用介绍

    iOS中的定时器大致分为这几类: NSTimer CADisplayLink GCD定时器 (一)NSTimer ...

网友评论

      本文标题:NSTimer 定时器销毁

      本文链接:https://www.haomeiwen.com/subject/mfbtjxtx.html