定时器的销毁
1、如果是在VC中创建的定时器,需要在dealloc方法中销毁
- (void)dealloc{
[_timer invalidate];
_timer = nil;
}
2、有时会自定义View,并且在这个View中创建定时器,这时直接在dealloc中销毁是无效的,
_timer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(startCount)
userInfo:nil repeats:YES];
因为创建定时器的时候,已经对self进行了强引用,所以self的dealloc不会调用的。
解决方法是在View的willMoveToSuperview方法中销毁
- (void)willMoveToSuperview:(UIView *)newSuperview {
[super willMoveToSuperview:newSuperview];
if (! newSuperview && self.timer) {
// 销毁定时器
[self.timer invalidate];
self.timer = nil;
}
}
补充:用递归代替定时器
(每间隔一秒钟就执行一次这个方法,如果需要停止,只要进入方法时return掉,就可以了,也不需要考虑循环引用的问题)
- (void)countTime:(UIButton *)btn{
NSLog(@"%s count = %ld",__FUNCTION__,count);
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.0 * NSEC_PER_SEC)),dispatch_get_main_queue(), ^{
if (count <= 1) {//恢复起始状态,准备重新倒计时
count = 120;
return ;
}else{
[self countTime:btn]; //递归
}
});
}