2011-11-14 30 views
0

我有幾個計時器按預先確定的時間間隔播放音樂。我試圖找出我是否正確取消它們,因爲我的代碼似乎不工作,因爲下面的例外。iPhone 4 iOS5如何正確取消幾個NSTimers與ARC?

我想所有的計時器添加到一個NSMutableArray,然後簡單地廢止他們中的每一個,以防止他們射擊這樣的:

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

我希望停止方法要經過陣列和無效定時器。我應該在計時器上調用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

關於一次刪除所有對象的好建議,我完全忘了這個選項! –