【IOS】自定义View添加NSTimer导致不释放的问题
2017-07-11 本文已影响112人
雨影
我们经常需要在自定义视图中添加动画.很多动画都需要用定时器实现.
但是如果我们在自定义view中添加定时器,如果不手动释放只是在
-(void)dealloc {
[_timer invalidate];
}
这样写如果你打断点调试,就会发现,即使ViewController退出了,这个方法仍然不会释放.
也就是我们这个自定义的View永远不会被释放掉了.同样,这个定时器也会一直运行.
这个问题如果当时没有多想一下,很容易忽略,因为编译不会有任何问题和提示.
因为NSTImer
会强引用self——你的拥有NSTimer
的那个view
,因此形成了一个循环引用。只有在NSTimer invalidate
之后才会释放self。
因此一种解决办法就是在ViewController的dealloc()
里主动 invalidate一下view里的timer。
但是我觉得在viewController中去停止子视图中的Timer
并不好, 不符合封装的思想.
所以我们可以在willMoveToSuperview:方法中停止定时器.
- (void)willMoveToSuperview:(UIView *)newSuperview {
[super willMoveToSuperview:newSuperview];
if (! newSuperview && self.timer) {
// 销毁定时器
[self.timer invalidate];
self.timer = nil;
}
}
运行之后发现,ViewController退出之后,view执行dealloc()
方法
以后用到Timer的时候,千万记得要想想有没有忽略什么.
完美解决!
Demo地址:https://github.com/yuying2012/WJDStudyLibrary
这是一个大工程,请从工程中寻找相关模块代码.