定時器的銷毀
1、如果是在VC中創(chuàng)建的定時器第焰,需要在dealloc方法中銷毀
- (void)dealloc{
[_timer invalidate];
_timer = nil;
}
2、有時會自定義View妨马,并且在這個View中創(chuàng)建定時器挺举,這時直接在dealloc中銷毀是無效的,
_timer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(startCount)
userInfo:nil repeats:YES];
因為創(chuàng)建定時器的時候烘跺,已經(jīng)對self進行了強引用湘纵,所以self的dealloc不會調(diào)用的。
解決方法是在View的willMoveToSuperview方法中銷毀
- (void)willMoveToSuperview:(UIView *)newSuperview {
[super willMoveToSuperview:newSuperview];
if (! newSuperview && self.timer) {
// 銷毀定時器
[self.timer invalidate];
self.timer = nil;
}
}
補充:用遞歸代替定時器
(每間隔一秒鐘就執(zhí)行一次這個方法滤淳,如果需要停止梧喷,只要進入方法時return掉,就可以了娇钱,也不需要考慮循環(huán)引用的問題)
- (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) {//恢復起始狀態(tài)伤柄,準備重新倒計時
count = 120;
return ;
}else{
[self countTime:btn]; //遞歸
}
});
}