2010-11-22 11 views
1

以下のコードでは、PersonListArrayはNSMutableArrayであり、sqlite DBの人のリストを取得して配列に追加しています。私はその私は推測しているメモリリークを与え、ここでPersonオブジェクトを解放していたとしてもnsarrayにオブジェクトを追加するときにメモリリークが発生する

Person* tmpPerson = [[Person alloc] init]; 
tmpPerson.personName = @"Mike"; 
tmpPerson.personEmail = @"[email protected]"; 

[PersonListArray addObject:tmpPerson]; 
[tmpPerson release]; 

は、それに参照カウントを保持する配列によるものです。私は、プログラムのどこかで配列を使用しているし、それを確実にリリースしています。

アレイの新しいオブジェクトを作成してこの問題に遭遇しないようにするにはどうすればよいですか?私は、アレイ

-(void) dealloc{ 
    [PersonListArray release]; // this contains the numerous Person objects 
    [super dealloc]; 
} 

は私が代わりに手動でこのようにそれらを解放すべきリリースdeallocメソッドで

-(void) dealloc{ 

    for (int i = 0; i<PersonListArray.count;i++) 
    { 
    Person * tmpPerson = [PersonListArray objectAtIndex:i]; 
    [tmpPerson release]; 
    } 

    [PersonListArray release]; 
    [super dealloc]; 
} 
+0

もっと良い画像を得るためのコードがいくつかあります。 @interface Person:NSObject { \t NSString * personName; \t NSString * personMobile; \t NSString * personEmail; \t @property(非構造、保持)NSString * personName、* personEmail、* personMobile; – ArdenDev

答えて

0

最初に実装されたコードが正しいです。配列は、追加されたオブジェクトを保持し、配列から削除されたとき、または配列の割り当てが解除されたときに解放します。あなた自身でアレイを通過する必要はありません。

どのような意味で漏れを検出していますか?それがインストゥルメントなら、それはあなたに何を伝えているのか誤解しているかもしれません。リークを検出すると、メモリが最初に割り当てられた場所が表示されます。どのオブジェクトがリークの原因であるかを示すことはできません。したがって、私は与えられたdeallocメソッドが呼び出されない(そのオブジェクトがリークされるため)、または他の誰かが配列を保持し、解放しないと推測します。それが発生していることを確認するために、NSLogをdeallocに入れてみてください。一度テストを実行すると、PersonListArrayを解放した後にロギングを試みることができます。もしメモリ例外が発生しなければ、他の誰かがそれを保持していることになります。

[削除済み:私の元のテキスト「あなたのdeallocに[PersonListArray retainCount]のNSLogを追加してみてください。

偶発的な追加の保持の最も一般的な原因は、保持するように設定されているが一致するリリースがdeallocに追加されない@ property/@ sythesizeプロパティです。

+0

私は機器を使用しており、その機器でも同じ動作をしています。 deallocメソッドが呼び出されます。上記のようにオブジェクト<-->の文字列変換メソッドを使用すると、リークがなくなります。これは本当に奇妙です – ArdenDev

+0

PersonName、personMobile、personEmailをPersonのdeallocで解放することを怠った可能性はありますか? – Tommy

+1

**デバッグ目的ではretainCountを使用しないでください**。オブジェクトの絶対保持数は、実装の詳細であり、正しく動作している間に期待するものではない場合があります。 – bbum

3

あなたが私たちに示しているコードは正確であり、漏れはありません。最後のセクションは間違っています。あなたがもう所有していないオブジェクトPersonをリリースしているため、プログラムがクラッシュすることになります。

+0

これでPersonオブジェクトを文字列リストに変換して配列に追加しようとすると、インストゥルメントの漏れはありません。しかし、配列からオブジェクトにアクセスするときには、すべてのオブジェクトを文字列に変換しなければならなくなります。 – ArdenDev

0

他のアプリのどこかで、[PersonListArray objectAtIndex:n]に電話して、アプリのさまざまな部分に渡している可能性があります。アプリの他の部分の1つがおそらくそれを漏らしています。

リークを使用している場合は、特定のタイプのリークをクリックし、メモリアドレスをクリックすると、そのメモリアドレスのalloc/free/retain/release/autoreleaseの履歴が表示されます。詳細ビューを有効にすると(Cmd-Eと思う)、それらのすべてについてもスタックトレースが表示されます。保持しているものの、対応するリリースではないものを探します。 (複数のオートレアライズされた配列によって物事が保持されているときにはちょっと難しいです...)