碰撞后删除对象

时间:2014-04-02 03:04:46

标签: objective-c arrays xcode

我正在制作游戏,游戏的一部分是收集鸡蛋的兔子。当兔子与鸡蛋相交时游戏正在崩溃,我遇到了一个问题。我得到的错误是收集< __ 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];   
    }
 }

我希望您能看到我的代码出错,并帮助我纠正问题。

提前感谢您的时间

2 个答案:

答案 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];