9

リークする次のコードがあります。Instruments は、リークしているのは rssParser オブジェクトであると述べています。XML フィードを「更新」すると、ブロックが実行され、リークが発生します....

file.h

@interface TestAppDelegate : NSObject <UIApplicationDelegate> {

    NSXMLParser *rssParser;

}

file.m

NSData *data = [ NSURLConnection sendSynchronousRequest:request returningResponse: nil error: nil ];
    rssParser = [[NSXMLParser alloc] initWithData:data];
    [rssParser setDelegate:self];
    [rssParser setShouldProcessNamespaces:NO];
    [rssParser setShouldReportNamespacePrefixes:NO];
    [rssParser setShouldResolveExternalEntities:NO];
    [rssParser parse];
    [rssParser release];

画像流出…。

代替テキスト http://www.shipfinder.co.uk/images/memoryleak.png

4

4 に答える 4

10

Appleから返事がありましたが、これはバグです#6469143

4.0の修正を計画しているようです

于 2010-01-22T06:44:07.117 に答える
3

最も可能性の高い原因は、デリゲート メソッドの 1 つがパーサーを保持していることです。デリゲート メソッドのパーサー パラメーターで何かをしていますか?

更新するたびにリークが発生しますか?

これが rssParser が使用される唯一の場所である場合、なぜそれを ivar にするのですか? ivar が必要な場合は、ivar に常にアクセサーを使用し、決して直接アクセスしないことがいかに重要かを強調しきれません。メモリ リークを回避する唯一の最善の方法は、ivar にアクセサーを使用することです。

また、何かをすぐに別のもの (通常は nil) に設定せずに解放しないでください。上記の rssParser のリリースは、潜在的に割り当てられていないメモリへのポインターを持っているため、発生するのを待っているクラッシュです。

于 2009-10-21T07:00:08.077 に答える
0

これはよく知られている問題のようです。ここNSURLConnection leakingを参照してください。ただし、パーサーを初期化する前に次のように設定すると、リークが停止します。

[[NSURLCache sharedURLCache] setMemoryCapacity:0];
[[NSURLCache sharedURLCache] setDiskCapacity:0];
NSXMLParser *parser = [[NSXMLParser alloc]initWithContentsOfURL:URL];
于 2009-11-09T17:50:50.590 に答える
0

この投稿で概説されている方法を使用して、これを修正しました。

これは回避策ですが、機能します。

別の注意として、Lion/Xcode 4.1 では、シミュレーターではなく常にデバイス上で実行すると、Instruments が確実に動作することがわかりました。シミュレーターでは、プロセスに時間のかかる悪魔がいるようです。

NSXMLParser の実装は当然リークしているようです。アプリの別の場所でこのライブラリから別のリークが発生しており、特定できるかどうかを確認する必要があります。これは非同期呼び出しであり、このソリューションはそのためには機能しないようです。

于 2011-09-19T12:20:35.117 に答える