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 に答える