DDXML解析器中的内存泄漏

问题描述:

我从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解析器是惊喜?

+0

在您释放xdoc之后,尝试释放'nodes'并查看是否会发生崩溃。如果没有,那么DDXML可能会返回一个非自动释放数组(一个给定方法名称的错误肯定会返回它)。如果这是真的,那么可能是阵列中的每个项目也不是自动发布的。 –

+0

看起来这是自动回收中的问题。有趣的是,当我将Internet连接从后台移动到前台线程并仅保留在后台解析时,autorelease池就可以工作。 – QuickNick

retainCount没用。别叫它。 http://whentouseretaincount.com/

不需要同时有drainrelease池;只是drain而已。

更好的是,在池的范围内使用@autoreleasepool {...}

由于您使用的是Allocations乐器,请打开“曲目引用计数”。然后,您可以查看保留/释放对象的历史记录,并了解为什么他们仍然在附近。

+0

感谢您的回答:)我解决了这个问题,但我还没有理解如何。有一个很大的研究领域。 – QuickNick