0

一组简化的方法来演示正在发生的事情:

- (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];
}

清除我做错了什么,但是什么?为什么每次按下都会有一个额外的计时器?

4

1 回答 1

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];
}
于 2012-05-02T16:52:01.890 回答