一组简化的方法来演示正在发生的事情:
- (void)timerDidFire {
NSLog(@"fire");
}
- (void)resetTimer:(NSTimer *)timer {
if (timer) [timer invalidate]; // timer = nil; here doesn't change anything
NSLog(@"%@", timer);
timer = [NSTimer ...Interval:1 ... repeats:YES];
}
- (IBAction)pressButton {
[self resetTimer:myTimer];
}
清除我做错了什么,但是什么?为什么每次按下都会得到一个额外的计时器?
答案 0 :(得分:2)
每次调用resetTimer:
方法时,都会创建一个新的NSTimer
实例。不幸的是,在完成此方法的执行后,您丢失了对新实例的所有引用,因为它已分配给本地变量
您在方法内创建的计时器未分配给myTimer变量。无论myTimer是什么,它都不是新创建的计时器。
您可以转储所有这些局部变量,只需使用以下内容:
- (void)resetTimer {
[myTimer invalidate]; // calls to nil are legal, so no need to check before calling invalidate
NSLog(@"%@", myTimer);
myTimer = [NSTimer ...Interval:1 ... repeats:YES];
}
- (IBAction)pressButton {
[self resetTimer];
}