Objective-C NSMutableArray在枚举时发生变异?

时间:2012-01-12 11:05:00

标签: iphone objective-c xcode

我偶然发现了一个错误,你尝试从NSMutableArray中删除对象,而其他对象被添加到其他地方。为了简单起见,我不知道如何修复它。这就是我正在做的事情:

我有4个定时器调用4个不同的方法,将对象添加到同一个数组中。现在,当我按下某个按钮时,我需要删除阵列中的所有对象(或至少一些)。所以我试图首先使所有4个计时器无效,然后用数组做我想要的工作,然后启动计时器。我认为这会有效,因为我不再使用定时器来枚举数组,但似乎它不起作用。

这里有什么建议吗?

5 个答案:

答案 0 :(得分:108)

这与你的计时器无关。因为(我假设)你的计时器都在与修改方法相同的线程上工作,所以你不需要停下来启动它们。 iOS不会使用中断模型进行计时器回调,他们必须像其他任何事件一样等待轮到他们:)

你可能正在做类似

的事情
for (id object in myArray)
   if (someCondition)
       [myArray removeObject:object];

您在浏览时无法编辑可变数组,因此需要创建一个临时数组来保存要删除的内容

// Find the things to remove
NSMutableArray *toDelete = [NSMutableArray array];
for (id object in myArray)
   if (someCondition)
       [toDelete addObject:object];

// Remove them
[myArray removeObjectsInArray:toDelete];

答案 1 :(得分:24)

你可以这样做:

for (id object in [myArray copy])
   if (someCondition)
       [myArray removeObject:object];

就像@deanWombourne所说的那样,“当你经历它时你不能编辑一个可变数组”,所以我在这里做的是创建一个自动释放的原始数组副本来枚举对象,所以你可以安全地删除任何你想要的东西。

更清晰,更少的锅炉代码(我认为!)。

更新:删除了自动释放呼叫,因为这是一个旧的答案,在ARC之前。

答案 2 :(得分:5)

您可以使用@synchronized()指令在变异时锁定数组:

if (someCondition) {
    @synchronized(yourArray) {
        [yourArray removeObject:someObject];
    }
}

http://developer.apple.com/library/ios/#documentation/cocoa/conceptual/objectivec/Chapters/ocThreading.html

的更多信息

答案 3 :(得分:0)

虽然最重要的是......我会与

分享我的经验
  

在枚举时发生变异

我所做的很简单,但完全是错误的:

for (id obj  in d.dataDashBoardGraph) {
    [tmpData addObject:[obj valueForKey:[[dataToShow[i] componentsSeparatedByString:@"_"] objectAtIndex:1]]];

    ...
}

即使这导致mutated being enumerated error。摆脱它:

for (id obj  in d.dataDashBoardGraph) {
   NSString *data = [dataToShow[i] copy];
   [tmpData addObject:[obj valueForKey:[[data componentsSeparatedByString:@"_"] objectAtIndex:1]]];

    ... 
}

然后它完美无缺。

答案 4 :(得分:0)

您可以尝试:

for (id object in [myArray reverseObjectEnumerator])
if (someCondition)
   [myArray removeObject:object];

如果您在索引x =>处移除对象索引x + 1,x + 2 ....处的对象索引将被更改。 因此,当您使用reverseObjectEnumerator时,删除某些对象后数组中对象的索引仍然会更正。

希望这有帮助。 (接受的答案是一个明确的解决方案。)