2011-05-01 12 views
1

私はiPhoneの目標C開発の新人です。次の方法を実行するとメモリリークが発生します。iphone NSSearchPathForDirectoriesInDomainsメモリリーク?

- (NSString *) getDBPath { 
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory , NSUserDomainMask, YES); 
    NSString *documentsDir = [paths objectAtIndex:0]; 
    return [documentsDir stringByAppendingPathComponent:@"dbname.sqlite"]; 
} 

と私はちょうど、以下にそれをダウントリムあれば...それはまだ

- (NSString *) getDBPath { 
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory , NSUserDomainMask, YES); 
    return nil; 
} 

ので、私はまだメモリリーク以下、と変数のパスを解放しようとしたがリークすることを見出しました。

- (NSString *) getDBPath { 
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory , NSUserDomainMask, YES); 
    [paths release]; 
    return nil; 
} 

リークを検出するために、私は次のループでプロファイラでそれを実行しています:

for (int iLoop = 0; iLoop < 30; iLoop++) { 
    NSString *dbPath = [self getDBPath]; 
    [dbPath release]; 
    sleep(1); 
} 

NSPathStore2とNSArrayMに関連付けられたメモリの量は増え続けています。

I間違っているかもしれないもの上の任意の提案?感謝! ありがとう!

+0

漏れを表示していますか?あなたが持っている最初の方法は、完全に合理的で、正確に何をすべきかです。 –

+0

これをプロファイラでループ内で実行します。上記のオリジナルの質問をループの詳細で更新しました。 –

+0

NSZombieEnabledはまだアクティブですか?これはバックグラウンドで実行されるため、NSAutoReleasePoolはありませんか? –

答えて

1

getDBPathのためのあなたのコードは大丈夫ですが、それはおそらく、任意の自動解放プールなしコンテキストから呼び出されました。

は、ループのコードで独自のプールを割り当てることによって、それを修正:

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 
for (int iLoop = 0; iLoop < 30; iLoop++) { 
    NSString *dbPath = [self getDBPath]; 
    // [dbPath release]; // do not release! dbPath will be autoreleased 
    sleep(1); 
} 
[pool drain]; 
0

あなたが所有していけないオブジェクトを解放するべきではありません。あなたの場合、所有していないメモリの割り当てを解除しようとしています。 「パス」の場合と同様に、常に「NSSearchPathForDirectoriesInDomains」によって割り当てられ管理されるメモリを参照します。だからあなたはこの場合にメモリを解放してはいけません。プログラムで使用するすべてのポインタのメモリを解放する必要はありません。お役に立てれば !

関連する問題