我昨天遇到了一个叫做“集合在被枚举时发生了变异”的异常,并看到了一些解决方案。我有另一个想法。如果我设置一个名为“锁定”的参数,并且每次我枚举我锁定它,然后在枚举后解锁它。每个有时间我会操作它,比如枚举或添加对象,我先锁定它,然后在操作后解锁它。有人可以告诉我它是否会起作用吗?
问问题
7122 次
3 回答
6
我解决了。问题之一是关于线程安全。使用
@synchronized (yourobject)
{
//do something with your object
}
这将起作用。这意味着它将锁定“您的对象”,以便其他线程无法修改它。然后在“}”之后解锁它
另一个是关于删除数组中的对象的一些代码。如果你立即删除,你会遇到名为'Collection was mutated while being enumerated'的异常。创建一个临时数组以包含要删除的对象,然后在删除后将它们全部删除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];
}
}
于 2012-05-03T03:08:44.007 回答
3
你应该复制它。如果它是一个数组,请执行以下操作:
NSArray *arrayToEnumerate = [myMutableArray copy];
现在枚举,您将不必担心在您之下更改非可变数组。
于 2012-05-02T03:18:12.463 回答
0
枚举时不能更改数组。作为一种解决方法,您应该在临时数组中累积新对象并在枚举后添加它们:
NSArray *tempArray = [yourArray copy];
for(id obj in tempArray) {
//It's safe to remove objects from yourArray here.
}
[tempArray release];
于 2012-12-01T17:14:11.817 回答