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对象都会被释放,因此当你尝试访问它时会崩溃。