前言:

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

定时器NSTimer:

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

>

self.mytimer = [NSTimer scheduledTimerWithTimeInterval:1 target:weakSelf selector:@selector(timerAction:) userInfo:nil repeats: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:nil repeats:YES];

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

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

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

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

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

转载于:https://www.cnblogs.com/develop-SZT/p/5266070.html

NSTimer循环引用的问题相关推荐

  1. nstimer循环引用_ios开发中经典循环引用场景?

    1.属性传值循环引用 如:- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexP ...

  2. nstimer循环引用_NSTimer定时器进阶——详细介绍,循环引用分析与解决

    引言 定时器:A timer waits until a certain time interval has elapsed and then fires, sending a specified m ...

  3. nstimer循环引用_解决NSTimer循环引用导致内存泄漏的六种方法

    demo放在了GitHub 内存泄漏的原因: self强引用timer.timer添加在runloop上,只要timer不销毁self就销毁不了.当然了你可以选择在viewWillDisappear中 ...

  4. nstimer循环引用_警惕使用NSTimer时的循环引用

    使用NSTimer可能会碰到循环引用的问题.特别是当类具有NSTimer类型的成员变量,并且需要反复执行计时任务时.例如 _timer = [NSTimer scheduledTimerWithTim ...

  5. nstimer循环引用_iOS中解决NSTimer循环引用问题

    NSTimer使用不当就会造成内存泄漏,比如常见的使用方法: //定义 @property (nonatomic, strong) NSTimer *timer; //实现 self.timer = ...

  6. nstimer循环引用_NSTimer循环引用的几种解决方案

    前言 在iOS中,NSTimer的使用是非常频繁的,但是NSTimer在使用中需要注意,避免循环引用的问题.之前经常这样写: - (void)setupTimer { self.timer= [NST ...

  7. nstimer循环引用_iOS容易造成循环引用的三种场景NSTimer以及对应的使用方法(一)...

    对,这就是NSTimer , 1.NSTimer会retain你添加调用方法的对象 2.NSTimer是要加到runloop中才会起作用 3.NSTimer会并不是准确的按照你指定的时间触发的 4.N ...

  8. iOS: NSTimer的循环引用(解决)

    首先有两个概念写在最前: 内存泄漏:系统分配的内存空间在使用完毕之后没有进行及时的回收,称之为发生了内存泄漏. 内存溢出:指在申请内存的时候,没有足够的内存空间可以使用,包括栈溢出和堆溢出. 下面开始 ...

  9. iOS循环引用问题集合、内存泄漏、僵尸对象、代码静态分析

    内存泄漏:https://my.oschina.net/llfk/blog/1031291 内存泄漏监测自动化:http://www.cocoachina.com/articles/18490 fac ...

最新文章

  1. JFinal 源码build脚本
  2. 页面滑动至某处,固定导航。
  3. python: 关于解决‘\u‘开头的字符串转中文的方法
  4. 分享Kali Linux 2017年第29周镜像文件
  5. 好几天没戴工牌坐地铁了,受不了!
  6. 编程心法 之什么是MVP What is MVP development?
  7. Python爬虫入门(5):URLError异常处理
  8. go sync.WaitGroup源码分析
  9. LeetCode -- 204. Count Primes
  10. linux weblogic修改内存,在linux运行weblogic出现运行内存不足错误,求鞭挞....
  11. NOI2019凉凉记
  12. ajax失败的原因,使用https协议失败的ajax请求失败的可能原因但http工作
  13. 安卓手机主题软件_手机看书神器!Amazon Kindleios、安卓软件
  14. 20191130每日一句
  15. 计算机专业考研入坑详解(持续更新)
  16. 数据库——数据库的备份和还原
  17. WPS在中文状态下输入的标点符号为英文的问题
  18. PHP技能架构思维导图(高清大图)详解
  19. agent开发之oneAgent
  20. 高校一键健康打卡及其检测系统

热门文章

  1. 基于概率论的分类方法—朴素贝叶斯
  2. 博客园如何转载别人的文章
  3. JFrame 居中显示
  4. JBoss/Wildfly 配置SQLserver服务器
  5. 讨论:如何降低Cocos2d开发的游戏包体大小
  6. (转)国外软件外包项目网站(适用软件兼职)
  7. 第三章 笔记本电脑案例
  8. 【安全牛学习笔记】SQLMAP- 自动注入
  9. Laravel源码入门-启动引导过程(四)app/Http/Kernel.php
  10. JS window对象的top、parent、opener含义介绍 以及防止网页被嵌入框架的代码