iPhone 4 iOS5如何使用ARC一次性正确取消多个NSTimers?

时间:2011-11-14 16:47:10

标签: objective-c ios5 nstimer automatic-ref-counting iphone-4

我有几个计时器以预先确定的间隔播放音乐。我正在试图找出我是否正确取消它们,因为我的代码似乎没有用,因为下面的例外情况。

我正在尝试将所有计时器添加到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 个答案:

答案 0 :(得分:3)

使用循环迭代元素时,不应更改数组内容。您可以随时使所有计时器无效,然后在阵列上调用removeAllObjects