2011-07-28 18 views
1

私はなぜこれが漏れているのか把握しようとしている私の髪を引き出している。私の.hファイルでは、NSMutableArrayを保持し、非構造の合成プロパティを持っています。私のviewDidLoadでは、私のようにそれを宣言:私のアプリケーションを通してNSMutableArrayのリーク

self.tableData = [[NSMutableArray alloc] init]; 
[self.tableData removeAllObjects]; 
fillData(self.tableData); 

、私は[self.tableData removeAllObjects]呼び出し、fillData(self.tableData)関数でそれを再作成します。

私はボールをドロップしなかった
[self.tableData removeAllObjects], [self.tableData release], tableData = nil; 

:私は私のdeallocメソッドで

void fillData(NSMutableArray* list) 
{ 
    for (set<string>::const_iterator itr = sortedData.begin(); itr != sortedData.end(); ++itr){ 
     [list addObject:[NSString stringWithFormat:@"%s", ((string)*itr).c_str()]]; 
    } 
} 

:この関数は、静的なC++文字列セットからデータをいっぱいになりますか? Instrumentsはそれが[list addObject ....]行にあると言っています。

おかげ

+0

あなたの '((string)* itr).c_str()'呼び出しは、オートリリースされていない文字列を返しますか? –

+0

はい、それは自動的に解放されるNSStringにコピーされます。だから私はこれがどうやってリークを引き起こしているのか分かりません。代わりにそのNSStringを割り当てる/ autoreleaseする必要がありますか? – Alede

+0

よく見えます。行を2つに分割し、 'const char * s =(* itr).c_str();に分割するとどうなりますか? [リストaddObject:[NSString stringWithUTF8String:s]; '? – Yuji

答えて

4
self.tableData = [[NSMutableArray alloc] init]; 
[self.tableData removeAllObjects]; 
fillData(self.tableData); 

1はallocのために保持して、1プロパティのセッターを使用するために保持します。あなたは+1をallocから釣り合わせていません。その中​​が完全に無意味であることを

self.tableData = [NSMutableArray array]; 
fillData(self.tableData); 

注:あなたはセッターを使用しようとしている場合。

これはあまりにも奇妙です:

[self.tableData removeAllObjects], [self.tableData release], tableData = nil; 

まず、オブジェクトを削除気にしないでください。配列の割り当てが解除されると、すべてのオブジェクトが解放されます。次に、セッターを使用してreleaseに電話し、すぐに直接割り当てを行うと矛盾します。どちらかの操作を行います。

self.tableData = nil; 

または:

[tableData release], tableData = nil; 

が(このすべてで ,の使用はあなたの利益のために純粋にもあることに注意してください - それは生成されたコードには影響しません。)

また、stringWithFormat:ではなく、stringWithUTF8String:を使用してください。

+0

よろしくお願いいたします。 – Alede

+0

+1、非常に良い説明。 – InsertWittyName

0

それは漏れだが、それが問題だよう、これが見えるかどうかわからない:

self.tableData = [[NSMutableArray alloc] init]; 

あなたはtableDataが保持の財産であると言います。試してください:

self.tableData = [NSMutableArray arrayWithCapacity:10]; 

このようにプロパティはそれを保持し、配列自体は自動リリースされます。 deallocのあなたのリリースは、保持カウントをゼロに戻します。

+1

'arrayWithCapacity:'を気にしないでください。*正確かつ常に*いくつのアイテムがあるのか​​分からない限り。それでも、それはコードのほんの一部にすぎず、インポートの実際のメリットはありません。 – bbum

0

問題は、プロパティがretainとして設定され、既に保持されているオブジェクトに設定することです。あなたがもう一度たtableDataを保持プロパティを使用して、あなたのdeallocで

// viewDidLoad 
NSMutableArray *array = [[NSMutableArray alloc] init]; 
self.tableData = array; 
[array release]; // this is important 

// dealloc 
self.tableData = nil; // will automatically release the array 
0

: あなたはこのようにそれを行う必要があります。それはあなたがそう、欲しいものは本当にありません:

[tableData release]; 

または

[self->tableData release]; // not necessary, but some prefer it. 

または

self.tableData = nil; // property will handle release 

たtableData、nilに何かを設定する必要はありません(あなたをクリアする必要はありません割り当てを解除しているので、もう何もそれにアクセスすることはありません)。