23

つまり、基本的に、このタイマーはキーイベントを受信したときに繰り返され、ユーザーがキーを離したときに無効になります。addTimer:forMode:ただし、 NSRunLoopでを呼び出しても、タイマーを「検証」することはできません。なぜこれが起こっているのか、そしてどうすればこれを修正できるのか誰かが知っていますか?ありがとう。

4

2 に答える 2

39

無効なタイマーは使用できません。

Apple Docsから:

実行ループでスケジュールされると、タイマーは無効になるまで指定された間隔で起動します。非反復タイマーは、起動直後にそれ自体を無効にします。ただし、タイマーを繰り返す場合は、invalidateメソッドを呼び出してタイマーオブジェクトを自分で無効にする必要があります。このメソッドを呼び出すと、現在の実行ループからタイマーを削除するように要求されます。その結果、タイマーがインストールされたのと同じスレッドから常にinvalidateメソッドを呼び出す必要があります。タイマーを無効にするとすぐに無効になり、実行ループに影響を与えなくなります。次に、runループは、invalidateメソッドが戻る直前、または後の時点で、タイマーを削除して解放します。無効にすると、タイマーオブジェクトは再利用できなくなります。

于 2012-02-13T07:43:11.907 に答える
14

NSTimerを無効にした後は、それを再度使用しないでください。

代わりに、新しいタイマーインスタンスを作成し、そのインスタンスを使用してNSRunLoopのaddTimerメソッドに追加します。個人的には、NSTimerのscheduledTimerWithTimeIntervalを呼び出すことを好みます。これは、すべてを1回のショットで実行するためです。

NSTimerドキュメントから:

このメソッドを呼び出すと、現在の実行ループからタイマーを削除するように要求されます。その結果、タイマーがインストールされたのと同じスレッドから常にinvalidateメソッドを呼び出す必要があります。タイマーを無効にするとすぐに無効になり、実行ループに影響を与えなくなります。次に、runループは、invalidateメソッドが戻る直前、または後の時点で、タイマーを削除して解放します。無効にすると、タイマーオブジェクトは再利用できなくなります。

于 2012-02-13T07:42:43.130 に答える