2012-02-19 206 views
2

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

问题:

基本上我有一个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阵列正在某处发布或以某种方式结束为。对于_food我唯一有一个release的地方是dealloc方法,所以我不明白为什么会发生这种情况。我很相当新的Objective-C(所以对我来说很容易!)但是据我所知,没有泄漏,也没有意外发布导致这种情况,我认为我需要的是专家的眼睛看到什么是最有可能我的一个微不足道的错误:-P

编辑: 食品的定义,在这里分配:

@interface MainLayer 
    { 
     NSMutableArray *_food; 
    } 

在类init方法

_food = [[NSMutableArray alloc] init]; 
+1

哪里是_food定义..给代码 – Shubhank 2012-02-19 19:06:28

+0

@Shubhank修改了这个问题:) – Peter 2012-02-19 19:13:24

+0

你的第二个for ... in子句是不必要的;你可以使用'[_food addObjectsFromArray:foodToKeep];' – bneely 2012-02-19 19:15:18

回答

4

overreleasing这里:

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 
} 

移除多余的版本,你应该罚款。

+0

Works!非常感谢,这让我非常沮丧。 – Peter 2012-02-19 19:37:55

1

您正在释放food您添加它后阵,但是当你到达[_food removeAllObjects]想必所有食品的对象得到释放也释放不平衡retain调用,这样,所以当你尝试以后再次访问它崩溃。

4

您正在发布Food您不属于的物品。看看Objective-C Memory Management Rules

事实上,在该行:

for (Food *food in _food) { 

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

+0

+1感谢您的额外信息,绝对好知道:) – Peter 2012-02-19 19:37:24