昨天我遇到了一个名为'收集在被枚举时被突变'的异常并看到了一些解决方案。我有另一个想法。如果我设置了一个名为'lock'的参数,每次我枚举我锁定它然后解锁后enumeration。每次我都会操作它,比如枚举或添加对象,我先锁定它然后在操作后解锁它。 有人能告诉我它是否有效?
答案 0 :(得分:6)
我解决了。其中一个问题是线程安全。使用
@synchronized (yourobject)
{
//do something with your object
}
这将起作用。这意味着它将'锁定'你自己'以便其他线程无法修改它。然后在'}'之后解锁它
另一个是关于删除数组中对象的一些代码。如果你立即删除,你将遇到名为'枚举时被收集的异常'的异常。创建一个临时数组来包含你想要删除的对象,然后删除它们所有在for循环之后。
NSMutableArray *toDestroy = [NSMutableArray arrayWithCapacity:_contactor.count];
for(Man *sprite in self.contactor)
{
if (sprite.hp<=0 && sprite.stat == stat_attack)
{
[sprite stopAllActions];
[sprite animDead];
[toDestroy addObject:sprite];
}
}
[self.contactor removeObjectsInArray:toDestroy];
而不是
for(Man *sprite in self.contactor)
{
if (sprite.hp<=0 && sprite.stat == stat_attack)
{
[sprite stopAllActions];
[sprite animDead];
[self.contactor removeObject:sprite];
}
}
答案 1 :(得分:3)
你应该复制它。如果是数组,请执行以下操作:
NSArray *arrayToEnumerate = [myMutableArray copy];
现在枚举,您不必担心在您之下更改不可变数组。
答案 2 :(得分:0)
在枚举数组时无法更改数组。作为一种解决方法,您应该在临时数组中累积新对象,并在枚举后添加它们:
NSArray *tempArray = [yourArray copy];
for(id obj in tempArray) {
//It's safe to remove objects from yourArray here.
}
[tempArray release];