iPhone游戏:枚举敌人

时间:2012-01-04 16:40:35

标签: iphone objective-c xcode cocos2d-iphone

所以我经常检查碰撞检测,每当敌人被杀死时,我都会从我正在迭代的数组中删除它。

这给了我enmueration变异例外,解决这个问题的正常方法是什么?

人们谈到制作阵列的副本,但是当我在每一秒钟内迭代它时,这个想法似乎很荒谬。

3 个答案:

答案 0 :(得分: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];

答案 1 :(得分:1)

基本上你在枚举时不能从数组中删除或添加,并且因为你似乎经常迭代数组然后你可能会得到很多这样的异常,一种选择是在迭代时锁定你的数组使用数组上的@synchronized块删除,这将保证您在迭代时不会修改数组...这种方法的缺点是你将迭代和添加/删除操作等待彼此... < / p>

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

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

答案 2 :(得分:1)

从您正在尝试的数组中删除项目可能会非常棘手。您可以执行Zoleas建议的操作,或者您可以避免枚举列表并从最后一个元素开始,然后向后检查第一个元素,删除需要删除的元素。这样,您可以确保永远不会删除会影响后面元素索引的元素。

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