【发布时间】:2011-11-14 16:47:10
【问题描述】:
我有几个定时器计划在预定的时间间隔播放音乐。我正在尝试确定我是否正确取消了它们,因为由于下面的异常,我的代码似乎无法正常工作。
我正在尝试将所有计时器添加到 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.
【问题讨论】:
-
这与ARC没有任何关系。你会在非 ARC 中得到同样的例外。你不能在 for(in) 循环中修改集合。
标签: objective-c ios5 nstimer automatic-ref-counting iphone-4