iPhone游戏:列举敌人

iPhone游戏:列举敌人,iphone,objective-c,xcode,cocos2d-iphone,Iphone,Objective C,Xcode,Cocos2d Iphone,所以我不断地检查碰撞检测,每当敌人被杀时,我就会将其从我迭代的数组中移除 这给了我很多异常,解决这个问题的正常方法是什么 人们谈论过制作数组的副本,但当我每隔一秒钟迭代一次时,这个想法似乎很荒谬。基本上,在数组被枚举时,你不能从数组中删除或添加,而且因为你似乎经常迭代数组,那么你可能会经常遇到这种异常,一种选择是在迭代时锁定数组,在使用@synchronized块删除数组时,这将保证在迭代时不会修改数组……这种方法的缺点是,迭代和添加/删除操作将互相等待 @synchronized(myArr

所以我不断地检查碰撞检测,每当敌人被杀时,我就会将其从我迭代的数组中移除

这给了我很多异常,解决这个问题的正常方法是什么


人们谈论过制作数组的副本,但当我每隔一秒钟迭代一次时,这个想法似乎很荒谬。

基本上,在数组被枚举时,你不能从数组中删除或添加,而且因为你似乎经常迭代数组,那么你可能会经常遇到这种异常,一种选择是在迭代时锁定数组,在使用@synchronized块删除数组时,这将保证在迭代时不会修改数组……这种方法的缺点是,迭代和添加/删除操作将互相等待

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

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

基本上,当数组被枚举时,您不能从数组中删除或添加,而且由于您似乎经常迭代数组,因此您可能会经常遇到此异常,一种选择是在迭代时锁定数组,并在使用数组上的@synchronized块删除时锁定数组,这将保证您在迭代时不会修改数组…这种方法的缺点是迭代和添加/删除操作将彼此等待

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

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

我同意蒂尔的意见。如果你的原始可变数组是self.friends,那么就这样做

NSArray * enemiesToRemove = [[NSMutableArray alloc] init];
for (Enemy * enemy in self.enemies) {
    if ([enemy colidesWithBullet]) {
        [enemiesToRemove addObject:enemy];
    }
}
[self.enemies removeObjectsInArray:enemiesToRemove];
[enemiesToRemove release];

我同意蒂尔的意见。如果你的原始可变数组是self.friends,那么就这样做

NSArray * enemiesToRemove = [[NSMutableArray alloc] init];
for (Enemy * enemy in self.enemies) {
    if ([enemy colidesWithBullet]) {
        [enemiesToRemove addObject:enemy];
    }
}
[self.enemies removeObjectsInArray:enemiesToRemove];
[enemiesToRemove release];

从正在处理的数组中删除项可能会很棘手。您可以像Zoleas建议的那样执行操作,也可以避免枚举列表,从最后一个元素开始,并向后检查第一个元素以删除需要删除的元素。通过这种方式,您可以确保从不删除会影响后续元素索引的元素

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

从正在处理的数组中删除项可能会很棘手。您可以像Zoleas建议的那样执行操作,也可以避免枚举列表,从最后一个元素开始,并向后检查第一个元素以删除需要删除的元素。通过这种方式,您可以确保从不删除会影响后续元素索引的元素

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

将这些要删除的元素添加到另一个数组中如何。然后,在枚举原始数组之后,只需从原始(第一)数组中删除第二个数组的所有元素。将这些元素添加到另一个数组中如何。然后,在枚举原始数组后,只需从原始(第一)数组中删除第二个数组的所有元素即可。不必为循环编写第二个
,只需执行以下操作:
[self.demoveobjectsinarray:enemiesToRemove]
不必为
循环编写第二个
,只需执行以下操作:
[self.demoveobjectsinarray:enemiesToRemove]