0

次のようにインスタンスをスケジュールしNSTimerます。

    [NSTimer scheduledTimerWithTimeInterval:.2 target:self selector:@selector(someMethod) userInfo:nil repeats:YES];

発砲を止めるようinvalidateに呼びかけることはできますが、NSTimer

    [NSTimer cancelPreviousPerformRequestsWithTarget:self];

タイマーを停止しません。私が確認したところ、[NSRunLoop currentRunLoop]まったく同じです(予想どおり、これらはユーザーのクリックへの応答です)。もちろん、selfインスタンスは常に同じです。なぜcancelキャンセルしないのですか?

4

1 に答える 1

3

cancelPreviousPerformRequestsWithTarget:NSTimer メソッドではなく NSObject メソッドであり、NSObject のperformSelector:メソッドの逆です。

[NSTimer cancelPreviousPerformRequestsWithTarget:self]は と同じで[NSObject cancelPreviousPerformRequestsWithTarget:self]、キャンセルされるのは以前の[self performSelector:… withObject:… afterDelay:…]メッセージです。NSTimer インスタンスとは関係ありません。

NSObject クラスではなく NSTimer クラスにメッセージを送信allocすると、クラスに送信するのと同じように機能します。それをオーバーライドするクラスはありません。NSObject の実装が継承されているため機能し、同じ理由で同じことを行います。

于 2011-09-28T22:13:03.820 に答える