我從Internet加載數據,並在另一個線程中使用DDXML解析器解析它。這裏是代碼(回調connectionDidFinishLoading:在後臺線程來了,我定的URLConnection在後臺線程):DDXML解析器中的內存泄漏
- (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。爲什麼這些對象不被清除?也許,我錯誤地使用autorelease池或DDXML解析器是驚喜?
在您釋放xdoc之後,嘗試釋放'nodes'並查看是否會發生崩潰。如果沒有,那麼DDXML可能會返回一個非自動釋放數組(一個給定方法名稱的錯誤肯定會返回它)。如果這是真的,那麼可能是陣列中的每個項目也不是自動發佈的。 –
看起來這是自動回收中的問題。有趣的是,當我將Internet連接從後臺移動到前臺線程並僅保留在後臺解析時,autorelease池就可以工作。 – QuickNick