我正在制作游戏,游戏的一部分是收集鸡蛋的兔子。当兔子与鸡蛋相交时游戏正在崩溃,我遇到了一个问题。我得到的错误是收集< __ NSArrayM:0x17805eed0>在被枚举时被突变。'
我有1个鸡蛋的图像,每隔几秒钟出现一次鸡蛋,当兔子与鸡蛋相交时,我只想让鸡蛋消失并给出1分。
以下是我正在使用的代码
在头文件中我有
@property (strong, nonatomic) NSMutableArray *eggs;
和实现文件我有这个添加鸡蛋
UIImageView *egg = [[UIImageView alloc] initWithFrame:CGRectMake(CGRectGetWidth([[self gameView] frame]), holeBottom - 115 , 50, 60)];
[egg setImage:[UIImage imageNamed:@"easterEgg.png"]];
[[self gameView] insertSubview:egg belowSubview:[self counterLabel]];
[[self eggs] addObject:egg];
这用于检测碰撞并试图移除鸡蛋
for (UIView *egg in [self eggs]) {
[egg setFrame:CGRectOffset([egg frame], [link duration]*FBSidewaysVelocity, 0)];
if ( CGRectIntersectsRect (rabbit.frame, CGRectInset ([egg frame], 8, 8))) {
[[self eggs]removeLastObject];
[self incrementCount];
}
}
我希望您能看到我的代码出错,并帮助我纠正问题。
提前感谢您的时间
答案 0 :(得分:1)
Collection <__NSArrayM: 0x17805eed0> was mutated while being enumerated
因为您在数组上循环,同时删除该数组中的对象。有几种方法可以解决这个问题,一种方法是在循环遍历原始数组eggs
时创建要删除的对象的新数组,并在循环结束后循环遍历此新数组,执行删除。
代码示例:
NSMutableArray *eggs;//this is full of delicious eggs
//...
NSMutableArray *badEggs = [NSMutableArray array];//eggs that you want to removed will go in here
for(NSObject *egg in [self eggs]){
if([egg shouldBeRemoved]){//some logic here
[badEggs addObject:egg];//add the egg to be removed
}
}
//now we have the eggs to be removed...
for(NSObject *badEggs in [self badEggs]){
[eggs removeObject:badEgg];//do the actual removal...
}
注意:您的代码行[[self eggs]removeLastObject];
在任何情况下看起来都是错误的...这会删除数组末尾的对象(我不认为你想要这样做......)
答案 1 :(得分:1)
错误消息,如果非常清楚您在枚举时不能进行可变收集(例如删除元素)(例如使用for in
循环)
最简单的解决方案是复制集合并枚举复制的集合
for (UIView *egg in [[self eggs] copy]) { // <-- copy
// you can modify `[self eggs]` here
}
或
NSMutableArray *tobeRemoved = [NSMutableArray array];
for (UIView *egg in [self eggs]) {
if (condition)
[tobeRemoved addObject:egg];
}
[[self eggs] removeObjectsInArray:tobeRemoved];