NSMutableArray访问问题

时间:2012-02-19 19:04:44

标签: iphone objective-c ios xcode memory-management

我(我想)知道你在想什么...不是另一个EXC_BAD_ACCESS问题,但我真的很挣扎,这让我发疯了。我在这里搜索了网络的高低,我面临的问题似乎与我的内存管理有关。

问题:

基本上我有NSMutableArray跟踪一些网络食物。由于食物可以同时添加和带走,我有一个单独的阵列,用于检查要移除的物品,并保留需要取出的物品。我们的想法是清除原始数组( _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];

将食物添加到原始数组时出现错误的访问错误。在搜索之后,听起来像 _food 数组正在某处释放或以某种方式结束为 nil release方法中我唯一拥有dealloc _food的地方,所以我无法理解为什么会发生这种情况。

我是Objective-C的新手(所以对我来说很容易!)但据我所知,没有任何泄漏,也没有意外释放造成这种情况,我认为我需要的是专家眼中的看看我最有可能犯了一个微不足道的错误:-P

修改 食物在这里定义和分配:

    @interface MainLayer
    {
        NSMutableArray *_food;
    }

在课程init方法

    _food = [[NSMutableArray alloc] init];

3 个答案:

答案 0 :(得分:4)

过度释放

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
}

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

答案 1 :(得分:4)

您正在发布您不拥有的Food个对象。看一下Objective-C Memory Management Rules

事实上,在行:

for (Food *food in _food) {

你没有对象食物,所以你不应该在第一个循环中释放它,也不应该在第二个循环中释放它。

答案 2 :(得分:1)

您在将food添加到阵列后发布retain,但该版本不会平衡[_food removeAllObjects]来电,因此当您到达{{1}}时,可能所有的食物对象都会在那里被取消分配因此,当您稍后再次尝试访问它时会崩溃。