因此,我经常检查碰撞检测,并且每当敌人死亡时,我将它从我正在迭代的数组中移除。iPhone游戏:枚举敌人
这是给我enmueration变异异常,解决这个问题的正常方法是什么?人们谈论制作数组的副本,但是当我重复它的时候,每一小部分的想法似乎都很荒谬。
因此,我经常检查碰撞检测,并且每当敌人死亡时,我将它从我正在迭代的数组中移除。iPhone游戏:枚举敌人
这是给我enmueration变异异常,解决这个问题的正常方法是什么?人们谈论制作数组的副本,但是当我重复它的时候,每一小部分的想法似乎都很荒谬。
我同意Till的评论。做这样的事情,如果self.enemies
是你原来的可变数组
NSArray * enemiesToRemove = [[NSMutableArray alloc] init];
for (Enemy * enemy in self.enemies) {
if ([enemy colidesWithBullet]) {
[enemiesToRemove addObject:enemy];
}
}
[self.enemies removeObjectsInArray:enemiesToRemove];
[enemiesToRemove release];
基本上,你不能删除或添加数组枚举,因为你似乎经常迭代数组,因此你可能会得到这个异常很多,一种选择是锁定你的数组,同时迭代,而同时你可以在数组上使用@synchronized块来移除,这将保证你在迭代时不会修改数组...这种方法的缺点是你将会有迭代和添加/删除操作,等待对方...
@synchronized(myArray)
{
//iterate through myArray
}
@synchronized(myArray)
{
//mutate the array
}
删除从一个数组,你是itterating过可能会非常棘手的项目。你可以做一些像Zoleas建议的事情,或者你可以避免枚举列表并从最后一个元素开始,然后向后检查第一个元素,删除需要删除的元素。这样你可以确保你永远不会删除一个影响后面元素索引的元素。
for(int i=[array count]-1; i >=0 :i--)
{
bool needsRemoved = /* your code here */;
if (needsRemoved)
{
[ary removeObjectAtIndex:i]
}
}
这很聪明:) – Zoleas 2012-01-05 08:28:44
如何将这些元素添加到另一个数组中去除。然后,枚举原始数组后,只需从原始(第一个)数组中删除第二个数组的所有元素。 – Till 2012-01-04 16:44:42