2012-02-13 6 views
19

基本的に、私はキーイベントを受け取ったときに繰り返すべきこのタイマーを持っていて、ユーザーがキーを離したときに無効にします。しかし、NSRunLoopのaddTimer:forMode:を呼び出しても、タイマーを "検証"することはできません。なぜこれが起こっているのか、これをどのように修正できるのか誰にも分かりますか?ありがとう。NSTimerを無効にした後でNSTimerを「検証する」方法は?

答えて

36

無効タイマーは使用できません。アップルのドキュメントから

それが無効化されるまで、実行ループ、指定された 間隔でタイマーがトリガーに予定したら。非繰り返しタイマは、起動直後に 自身を無効にします。ただし、繰り返しタイマーの場合は、 メソッドを呼び出すことによって自分自身を無効にする必要があります。 メソッドこのメソッドを呼び出すと、現在の実行ループの からタイマーの削除が要求されます。その結果、タイマーがインストールされている同じスレッドから常に無効化 メソッドを呼び出す必要があります。 タイマーを無効にすると即座に無効になり、実行ループに影響しないようになります( )。次に、実行ループは、 タイマーを削除し、無効化メソッドが返される直前に、または 後の時点でタイマーを解放します。無効化されると、タイマーオブジェクトは再利用できません。

+0

興味深いことに、NSRunLoop addTimerがありますが、有効化されていたremoveTimerがないため、タイマーを無効にすることなく起動できませんでした。それは、アップルがそのAPIを追加するのを邪魔しないように、ポートの作成よりもタイマーの作成が安いことでなければなりません。 –

13

NSTimerを無効にしたら、もう一度使用しないでください。

代わりに、新しいタイマーインスタンスを作成し、そのインスタンスを使用してNSRunLoopのaddTimerメソッドに追加します。個人的には、NSTimerのscheduledTimerWithTimeIntervalを呼び出すほうが好きです。なぜなら、それはすべての処理をワンショットで行うからです。 NSTimer docsから

このメソッドを呼び出すと、現在の 実行ループからのタイマーの削除を要請します。結果として、無効化メソッド は、タイマーがインストールされた同じスレッドから常に呼び出す必要があります。 を無効にすると、タイマーはただちにそれを無効にして、ループ実行に影響しなくなります。 その後、実行ループは、無効化メソッドが返る前に、または後で、 のいずれかのタイマーを削除して解放します。 が無効になると、タイマーオブジェクトは再利用できません。

+0

右、私はそれを知らなかった...ありがとう! – TheAmateurProgrammer

関連する問題