2012-02-19 4 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の配列がどこかでリリースされているか、何らかの形でnilとして終了しているようです。私がreleaseを_foodに持っている唯一の場所は、deallocメソッドにあるので、なぜこれが起こっているのか理解できません。

私はObjective-Cをかなり新しくしています(私には簡単に行くことができます)が、漏れや偶発的なリリースがない限り、私はエキスパートアイが必要だと思う最も可能性が高い私の部分に些細な間違いが何であるかを確認してください:-P

編集: 食品が定義されており、ここに割り当てられている:クラスで

@interface MainLayer 
    { 
     NSMutableArray *_food; 
    } 

init方法

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

ここでは_foodが定義されています。コード – Shubhank

+0

を与える@Shubhankは質問を修正しました:) – Peter

+0

あなたの2番目のfor ... in句は不要です。代わりに '[_food addObjectsFromArray:foodToKeep];'を使用することができます; – bneely

答えて

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

1

あなたは配列に追加した後、あなたはfoodをリリースしているが、あなたはおそらく、すべての食品のオブジェクトが割り当て解除を取得[_food removeAllObjects]に到達したときのリリースはとてもretainコールのバランスをとるしないと、後で再度アクセスしようとするので、それがクラッシュします。

4

あなたが所有していないオブジェクトFoodを解放しています。 Objective-C Memory Management Rulesを見てください。実際に

は、行に:

for (Food *food in _food) { 

あなたは、オブジェクト食べ物を所有していないので、あなたは、最初のループでは、また第二のループでそれを解放するべきではありません。

+0

+1余分な情報をありがとう、間違いなく知っておいてよかった:) – Peter