我偶然发现了一个错误,你尝试从NSMutableArray中删除对象,而其他对象被添加到其他地方。为了简单起见,我不知道如何修复它。这就是我正在做的事情:
我有4个定时器调用4个不同的方法,将对象添加到同一个数组中。现在,当我按下某个按钮时,我需要删除阵列中的所有对象(或至少一些)。所以我试图首先使所有4个计时器无效,然后用数组做我想要的工作,然后启动计时器。我认为这会有效,因为我不再使用定时器来枚举数组,但似乎它不起作用。
这里有什么建议吗?
答案 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];
}
}
的更多信息
答案 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时,删除某些对象后数组中对象的索引仍然会更正。
希望这有帮助。 (接受的答案是一个明确的解决方案。)