【IOS】自定义View添加NSTimer导致不释放的问题

我们经常需要在自定义视图中添加动画.很多动画都需要用定时器实现.
但是如果我们在自定义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
这是一个大工程,请从工程中寻找相关模块代码.

你可能感兴趣的:(【IOS】自定义View添加NSTimer导致不释放的问题)