2012-01-04 80 views
1

因此,我经常检查碰撞检测,并且每当敌人死亡时,我将它从我正在迭代的数组中移除。iPhone游戏:枚举敌人

这是给我enmueration变异异常,解决这个问题的正常方法是什么?人们谈论制作数组的副本,但是当我重复它的时候,每一小部分的想法似乎都很荒谬。

+2

如何将这些元素添加到另一个数组中去除。然后,枚举原始数组后,只需从原始(第一个)数组中删除第二个数组的所有元素。 – Till 2012-01-04 16:44:42

回答

3

我同意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]; 
+0

而不是写第二个'for'循环,你可以这样做:'[self.enemies removeObjectsInArray:enemiesToRemove];' – jlehr 2012-01-04 17:49:30

+0

该死的,完全!我要编辑我的答案,thx :) – Zoleas 2012-01-05 08:27:36

1

基本上,你不能删除或添加数组枚举,因为你似乎经常迭代数组,因此你可能会得到这个异常很多,一种选择是锁定你的数组,同时迭代,而同时你可以在数组上使用@synchronized块来移除,这将保证你在迭代时不会修改数组...这种方法的缺点是你将会有迭代和添加/删除操作,等待对方...

@synchronized(myArray) 
{ 
    //iterate through myArray 
} 

@synchronized(myArray) 
{ 
    //mutate the array 
} 
1

删除从一个数组,你是itterating过可能会非常棘手的项目。你可以做一些像Zoleas建议的事情,或者你可以避免枚举列表并从最后一个元素开始,然后向后检查第一个元素,删除需要删除的元素。这样你可以确保你永远不会删除一个影响后面元素索引的元素。

for(int i=[array count]-1; i >=0 :i--) 
{ 
    bool needsRemoved = /* your code here */; 
    if (needsRemoved) 
    { 
    [ary removeObjectAtIndex:i] 
    } 
} 
+0

这很聪明:) – Zoleas 2012-01-05 08:28:44