【问题标题】:iPhone 4 iOS5 How to properly cancel several NSTimers at once with ARC?iPhone 4 iOS5 如何使用 ARC 一次正确取消多个 NSTimer?
【发布时间】: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


【解决方案1】:

在使用循环迭代元素时,不应更改数组内容。你总是可以让所有定时器失效,然后在数组上调用removeAllObjects

【讨论】:

  • 一次删除所有对象的好建议,我完全忘记了这个选项!
猜你喜欢
  • 2012-02-03
  • 1970-01-01
  • 2015-08-08
  • 2011-04-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-07
相关资源
最近更新 更多