NSMutableArray访问问题

我(想)我知道你在想什么…不是另一个EXC_BAD_ACCESS问题,但我真的很挣扎,这让我疯狂。 我在网上search了很多在这里,我面临的问题似乎与我的memory management有关。

问题:

基本上我有一个NSMutableArray ,跟踪一些networking食物。 由于食物可以在同一时间被添加和拿走,所以我有一个单独的数组,用于检查要移除的物品,并保存那些不需要取出的物品。 这个想法是清除原始数组( _food ),并将临时数组( foodToKeep )中保存的所有项目复制回来。 这是代码

 NSMutableArray *foodToKeep = [[NSMutableArray alloc] init]; for (Food *food in _food) { if(!food.removeable){ [foodToKeep addObject:food]; [food release]; } } if(foodToKeep > 0){ [_food removeAllObjects]; for (Food *food in foodToKeep) { [_food addObject:food]; // EXC_BAD_ACCESS error here [food release]; } } } [foodToKeep release]; 

将食物添加到原始数组时,出现错误的访问错误。 在四处search后,听起来_food数组正在某处被释放,或者以某种方式结束为零 。 我有一个release _food的唯一地方是dealloc方法,所以我不明白为什么会发生这种情况。

我相当新的Objective-C(所以对我来说很容易!)但据我所知,没有泄漏,没有意外的发布,这是我所需要的是专家的眼睛,看看是什么很可能是我的一个微不足道的错误:-P

编辑:在这里定义和分配食物:

  @interface MainLayer { NSMutableArray *_food; } 

在类的init方法中

  _food = [[NSMutableArray alloc] init]; 

你在这里过度释放

 for (Food *food in _food) { if(!food.removeable){ [foodToKeep addObject:food]; // [food release]; <--- REMOVE THIS } } 

和这里

 for (Food *food in foodToKeep) { [_food addObject:food]; // EXC_BAD_ACCESS error here // [food release]; <--- REMOVE THIS } 

删除额外的版本,你应该没问题。

你正在释放你不拥有的Food对象。 看看Objective-C 内存pipe理规则 。

其实在这一行里:

 for (Food *food in _food) { 

你不拥有食物,所以你不应该把它放在第一圈,也不要放在第二圈。

添加到数组后,你释放food ,但释放并不平衡retain呼叫,所以当你到达[_food removeAllObjects]大概所有的Food对象都会被释放,因此当你尝试访问它时会崩溃。