0

インターネットからデータをロードし、別のスレッドで DDXML パーサーを使用して解析します。コードは次のとおりです (コールバック connectionDidFinishLoading: はバックグラウンド スレッドで実行されます。バックグラウンド スレッドで URLConnection をスケジュールしました):

- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
    NSLog(@"connection did finish load");
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    DDXMLDocument *xdoc = [[DDXMLDocument alloc] initWithData: receivedXmlData options:0 error: NULL];
    NSLog(@"document retainCount1 = %d", [xdoc retainCount]);
    NSArray *nodes = [xdoc selectNodes: @"./items/item"];
    NSLog(@"document retainCount2 = %d", [xdoc retainCount]);
    for (DDXMLElement *tabXmlItem in nodes)
    {
        // here is the parsing
    }
    NSLog(@"document retainCount3 = %d", [xdoc retainCount]);
    [xdoc release];
    [receivedXmlData setLength:0];
    [pool drain];
    [pool release];
}

メモリ アロケーターに表示されます: DDXMLDocuments、DDXMLNodes、DDXMLElements は、解析の終了後もまだ有効です。そのため、メモリには大量の CFString と CFData があります。これらのオブジェクトがクリアされないのはなぜですか? 自動解放プールの使い方が間違っているのか、それとも DDXML パーサーに驚きがあるのでしょうか。

4

1 に答える 1

2

retainCount役に立たない。呼ばないで。 http://whentouseretaincount.com/

プールの両方drainを使用する必要はありません。releaseそれだけdrainです。

いっそのこと@autoreleasepool {...}、プールのスコープの周りで使用してください。

Allocations インストゥルメントを使用しているため、「トラック参照カウント」をオンにします。次に、残っているオブジェクトの保持/解放の履歴を見て、それらがまだ残っている理由を確認できます。

于 2012-09-07T16:28:24.080 に答える