2009-07-23 18 views

答えて

8

2つの方法は異なる処理を行います。あなたがタイマーを所有している(それを保持していたり​​、割り当てていたり、コピーした)場合は、それを解放する必要があります。実行ループでスケジューリングした場合は、実行ループで無効にして解放する必要があります。両方を行った場合は、タイマーを解放して無効にする必要があります(通常、タイマーを所有する実行ループで十分です)。

+0

最初のリリースを解除し、割り当て解除で無効にしますか? セレクタで引数を2つ指定して引数を送信できますか? –

+0

まずそれを無効にしてから、それを解放します(あなたが所有している場合)。あなたの最後の質問を明確にしてください。 1回の呼び出しでタイマーの無効化と解放を呼び出すことができるかどうかを尋ねる場合、これら2つのことを行う独自の簡易メソッドを作成し、そのメソッドを呼び出さない限り、答えはいいえです。 – Felixyz

+0

NSTIMERの@selectorで余分な議論を送ることができますか? –

0

これは、実行中の可能性があり、停止したいタイマーの割り当てを解除する正しい方法です。

+1

あなたが最初にタイマーを所有していると仮定します。そうしないと、 '-release'呼び出しがクラッシュします。あるいはそうするべきです。 –

1

いつも、あなたがやっているのは最後です。いったん何かをリリースすると、オブジェクトの参照を解除するのが安全であるという保証はなくなります。つまり、メッセージを送信することはもはや安全です。

15

は、タイマーを所有している場合にのみ呼び出す必要があります。 Apple's documentation:

実行ループはメモリ管理の観点からタイマを維持しているため、通常はスケジュールを設定してからタイマを参照する必要はありません。セレクタとしてメソッドを指定すると、タイマが引数として渡されるため、そのメソッド内で適切なときに繰り返しタイマを無効にすることができます。しかし、多くの状況では、タイマーを無効にするオプションが必要になることもあります。この場合、タイマーへの参照を保持する必要があります。そうすれば、いつでも無効メッセージを送信できます。スケジュールされていないタイマー(“Unscheduled Timers”を参照)を作成する場合、使用する前に割り当て解除されないように、タイマー(参照カウントされた環境では、保持します)を強く参照する必要があります。

これはどういう意味ですか?またreleaseそれなので、同じよう

はあなたallocinitタイマー場合は、必要があります:タイマーが実行ループに追加された後

NSTimer * timer = [[NSTimer alloc] initWith...]; 

NSRunLoop * runLoop = [NSRunLoop currentRunLoop]; 
[runLoop addTimer:timer forMode:NSDefaultRunLoopMode]; 
[timer release]; 

... 
... 

[timer invalidate]; 
timer = nil; 

、もうそれへの参照を維持する理由はありません実行ループはそれを所有しているからです。この場合、示されているように、実行ループに追加するとただちにreleaseタイマーとなり、終了すると簡単にinvalidateになります。最後の行(タイマーをnilに設定)は安全のためのものです。 invalidateを呼び出すと、(実行ループによって)タイマーが解放されるため、それを指す参照を保持することは危険です。ローカル参照をnilに設定すると、物事がきれいになります。

場合は、しかし、あなたはそうのような便利なメソッドのいずれかを使用して、タイマーを作成します。

NSTimer * timer = [NSTimer scheduledTimerWithTimeInterval ...]; 

をあなたはを行う全く[timer release]を呼び出す必要はありませ!便利なメソッドは、タイマーを実行ループに追加します。実行ループはそれを所有しているため、返されたタイマーオブジェクトに対してメモリ管理を実行する必要はありません。あなたは、単にinvalidateあなたは、もはやそれを使用したいタイマーだろう:

[timer invalidate]; 
timer = nil; 

あるいは、タイマーが繰り返すように設定されていない場合、それはその最初の呼び出しの後にリリースされるので、あなたは、すべてで絶対に何もしないだろう。

+2

[timer release]を呼び出すとすぐに、タイマーが有効であると見なすのは適切ではありません。単一のメソッドの場合、ほとんどの場合、そのようにするのが大丈夫ですが、[timer invalidate]の後に[timer release]を配置すると、コードはより良いフォームになります。 –

+0

すばらしい実用的な答えです。 – Ross

関連する問題