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]代码>