我从Internet加载数据,并在另一个线程中使用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解析器是惊人的?
答案 0 :(得分:2)
retainCount
没用。别叫它。 http://whentouseretaincount.com/
无需drain
和release
游泳池;只是drain
它。
更好的是,在池的范围内使用@autoreleasepool {...}
。
由于您使用的是分配工具,请启用“跟踪引用计数”。然后,您可以查看保留/释放的历史记录,并了解它们仍然存在的原因。