我有几个计时器以预先确定的间隔播放音乐。我正在试图找出我是否正确取消它们,因为我的代码似乎没有用,因为下面的例外情况。
我正在尝试将所有计时器添加到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.
答案 0 :(得分:3)
使用循环迭代元素时,不应更改数组内容。您可以随时使所有计时器无效,然后在阵列上调用removeAllObjects
。