我们经常需要在自定义视图中添加动画.很多动画都需要用定时器实现.
但是如果我们在自定义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 =