NSTimer循环引用的问题
2017-04-27 15:17
253 查看
前言:
记得之前看过一个面试题问: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就可以解决问题。
与其说是自己被坑不如说是对它认识的不足,对网上很多人的答案都坚信不疑,才会使自己一开始就陷入错误
相关文章推荐
- NSTimer循环引用不释放问题
- NSTimer的循环引用问题
- NSTimer造成循环引用的问题
- 解决NSTimer循环引用Retain Cycle问题
- 关于java中对象的循环引用问题(java编程思想)
- IOS内存管理的经典问题(循环引用)
- WCF自引用和循环引用导致的序列化问题
- iPhone开发资料之内存管理 ,循环引用导致的内存问题
- WCF+Nhibernate循环引用导致序列化的问题
- ios block循环引用问题
- c++智能指针循环引用带来的问题及解决方案
- 解决Eclipse中Java工程间循环引用而报错的问题
- 引用 头文件循环倚赖问题
- 关于Block的copy和循环引用的问题
- ARC下循环引用的问题
- 循环引用问题,
- std::shared_ptr 和 std::weak_ptr的用法以及引用计数的循环引用问题
- LINQ TO SQL学习笔记(3)_解决通用基类的循环引用问题
- 采用CXF解决webservice循环引用对象的问题
- ios block循环引用问题