2011-01-28 10 views
3

デフォルトでは、メソッドallocまたはcopyによるオブジェクトの戻りはretain countになりますので、自分で解放する必要があります。NSTimerメモリ管理の質問

しかし、NSTimerのサンプルコードによる

 
// in one method start the timer (which myTimer is an Class Instance) 
myTimer = [NSTimer scheduledTimerWithTimeInterval:1 
        target:self selector:@selector(method:) 
        userInfo:nil repeats:YES]; 

// in another method 
[myTimer invalidate]; 
myTimer = nil; 

私の質問は、なぜある[NSTimer SCHE **]あなたが保持していない必要なオブジェクトを返しますが、あなたはどこにでもアクセスすることができます。そして、あなたはそれを解放する必要はありませんが、それにはinvalidateを呼び出すだけです。

答えて

4

インスタンスは、割り当てられた実行ループに保持されます。 実行ループがそれを解放するまで、保持カウントはゼロより上のままです。 そのようになるまで、オブジェクトにアクセスできます。 NSTimer docsから

タイマーは、実行 ループと連動して動作します。タイマーを効果的に使用するには、 の実行ループ(NSRunLoopおよびスレッディング プログラミングガイドを参照)の動作を、 に認識させる必要があります。実行ループがタイマーを保持する特に に注意してください。 を実行ループに追加した後で、タイマーを解放することができます。

そして特に:

使用 scheduledTimerWithTimeInterval:呼び出し:繰り返し: または scheduledTimerWithTimeInterval:ターゲット:セレクタ:のUserInfo:繰り返し:タイマーを作成する クラスメソッドと スケジュールでそれ現在の実行ループは で、デフォルトモードです。

したがって、使用した方法は、現在の実行ループで自動的に機能します。