2012-02-19 112 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