所以我经常检查碰撞检测,每当敌人被杀死时,我都会从我正在迭代的数组中删除它。
这给了我enmueration变异例外,解决这个问题的正常方法是什么?
人们谈到制作阵列的副本,但是当我在每一秒钟内迭代它时,这个想法似乎很荒谬。
答案 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]
}
}