以下是否会导致内存泄漏或者可能会以某种方式更改为更好?删除countDownTimer = nil
-(void)viewDidLoad{
countDownTimer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(loadNewTime:) userInfo:nil repeats:YES];
}
-(void)pauseTimer{
NSLog(@"Fired");
[countDownTimer invalidate];
//countDownTimer = nil <------ Causes crash when run
}
-(void)resumeTimer{
countDownTimer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(loadNewTime:) userInfo:nil repeats:YES];
}
答案 0 :(得分:1)
我认为countDownTimer
是伊娃? NSTimer
在他们活着的时候会保留目标,所以听起来你对[countDownTimer invalidate]
的调用正在释放self
的最后一个引用并导致self
在中间解除分配您的-pauseTimer
方法。因此,对self
的任何引用,甚至是隐式引用(例如访问ivars)都会崩溃,或者至少会出现意外行为。
谁在致电-pauseTimer
?也许他们应该对你的目标有一个强有力的参考。
答案 1 :(得分:1)
NSTimer在到期或无效时自动减少其保留计数。除非您将其指定为保留的ivar,否则无需将其设置为nil。 (在您的情况下意味着您还需要使用self.countDownTimer分配计时器
答案 2 :(得分:1)
一个人可以使用block
方法的scheduleTimer
变体来避免保留周期。
var timer = Timer()
func startTimer() {
timer = Timer.scheduleTimer(withTimerInterval: 1.0, repeats: true, block: { [weak self] (timer) in
self?.performUpdate(timer: timer)
})
}
func stopTimer() {
timer.invalidate()
}
只需确保将self
捕获为weak
变量即可。