2011-02-04 20 views
0

私はいくつかのビュー要素を持つNSMutableArrayを持っています。NSMutableArrayのEXC_BAD_ACCESS

ビュー階層からビューを削除し、配列の保持カウントをチェックすると、1が返されます。[array release]を送信しますが、コードはEXC_BAD_ACCESSでダンプします。

配列内に要素がありますが、コードダンプがあります。

ここに私がデバッグ中に見つけたものがあります。配列には100個のオブジェクトがすべて存在し(配列の数は100を返します)、デバッガで表示された内容は要素の「範囲外」を返します。また、配列は、ビュー階層にあるため、次のコードは、2つのことで保持カウントを減らす:

for (Liv *view1 in viewArray){ 
    NSLog(@"view count = %d", [view1 retainCount]); 
    [view1 removeFromSuperview]; 

    NSLog(@"view count = %d", [view1 retainCount]); 
} 
+0

even [array removeAllObjects]ダンプ – DKV

答えて

0

はあなたretainまたはallocに配列しましたか?そうでない場合は、releaseを送信しないでください。

EXC_BAD_ACCESSは、すでにリリースされているオブジェクトにメッセージを送信していることを意味します。コード(または(または​​))を送信する部分の前に、あなた(またはどこかのコード)がそれを解放しています。

基本的には、保持とリリースのバランスが取れていれば、このエラーは発生しません。一般的なアドバイスよりも何かを提供できるようになるには、いくつかのコードを見る必要があります。

NSLog()retainCountを使用することは、このようなエラーをデバッグする最も簡単な方法ではありません。あなたがXcode 3.2.6を使用していると仮定し、実行>パフォーマンスツールで実行>ゾンビでコードを実行してみてください。それはあなたのコードのどの部分に欠陥があるかを示すよいポインタを与えるはずです。

+0

はい私は配列を初期化します – DKV

+0

ここではデバッグ中に見つかったものがあります。配列には100個のオブジェクトがすべて存在します(配列が100を返します)。デバッガは、要素の「範囲外」を返します。また、配列がビュー階層にあるため、次のコードでは、保持カウントを2つ減らします。 for(viewArrayのLiv * view1){ NSLog(@ "view count =%d"、[view1 retainCount]); [view1 removeFromSuperview]; \t NSLog(@ "ビュー数=%d"、[view1 retainCount]); \t \t } – DKV

3

retainCountを使用しないでください。

この種のデバッグには無駄です。フレームワークのビュー階層内のビューを使用して作業しています。保持カウントが2,10、または42ずつ増加または減少する理由はいくつでもあります。

これまでに投稿されたラウンドアバウトの証拠から、これは非常に単純なメモリ管理の問題のようです。

まず、 "ビルドと分析"を使用して、llvmスタティックアナライザーにコードをチェックさせます。識別された問題を修正します。

次に、配列はどのように割り当てられていますか?どこに保管しますか?配列を宣言または操作するすべてのコード行をポストします。

最後に、ポールが言ったように、ゾンビをオンにして何が起こるか見る。

これは、保持/解放の問題ではない可能性がありますが、それを示す証拠はまだありません。