2011-11-14 4 views
0

私は、あらかじめ決められた間隔で音楽を再生する予定のタイマーをいくつか持っています。私は私のコードは、以下の例外のために動作するように見えないので、私はそれらを正しく取り消しているかどうかを調べようとしています。iPhone 4 iOS5 ARCを使って複数のNSTimersを正しくキャンセルするにはどうすればいいですか?

私はNSMutableArrayのにすべてのタイマーを追加しようと、単に次のように発射することを防ぐためにそれらの一つ一つを無効にしています:

[playTimers addObject:[NSTimer scheduledTimerWithTimeInterval:reminderDelay target:self selector:@selector(appMusicPlayerPlay:) userInfo:nil repeats:NO]]; 

私はstopメソッドは配列と無効化を経ることを期待タイマー。タイマーでremoveObjectを呼び出すか、単にARCで配列を再割り当てする方が簡単ですか?

[更新:ここでは、一度にすべてのタイマーをキャンセルするように補正ソリューションです]

-(int)stop 
{ 
    [musicPlayer pause]; 
    [self pause]; 
    @try { 
     for(NSTimer* timer in playTimers) 
     { 
      [timer invalidate]; 
     } 
    } 
    @catch (NSException *exception) { 
     NSLog(@"exception: %@",[exception description]); 
    } 
    @finally { 
     [playTimers removeAllObjects] 

    } 

    state = kRemoteControlStateStopped; 
    return state; 
} 

ここで私は、配列を反復しながら、NSMutableArrayのからオブジェクトを削除しようとした後にキャッチされた例外です。

*** Collection <__NSArrayM: 0x5429330> was mutated while being enumerated. 
+1

これは実際にARCとは関係ありません。非ARCでも同じ例外が発生します。 for(in)ループ内のコレクションは変更できません。 –

答えて

3

ループを使用して要素を反復処理する際に、配列の内容を変更しないでください。それ以降は常にすべてのタイマーを無効にして、​​を呼び出すことができます。

+0

一度にすべてのオブジェクトを削除することについての素晴らしい提案、私は完全にそのオプションを忘れてしまった! –