インターネットからデータをロードし、別のスレッドで 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 パーサーに驚きがあるのでしょうか。