NSXMLParser第二个解析呼叫的内存泄漏

问题描述:

更新:当泄漏仪器指向第一个呼叫[parser parse];时,我发现泄漏只发生在我第二次打这个呼叫时。我没有在NSXMLParser类的引用或文档中看到任何表示无法重新解析的内容。我错过了什么吗?我是否应该每次创建一个新的NSXMLParser来解析文档?NSXMLParser第二个解析呼叫的内存泄漏

我目前正在尝试追查我的XML解析代码为iPhone应用程序泄漏。我已经通过其他关于NSXMLParser漏洞的帖子进行了搜索,但没有找到任何可以使用的答案,所以我非常感谢帮助。

文书泄漏工具在下面的代码检测泄漏:

NSData* data = [NSData dataWithContentsOfFile: [[NSBundle mainBundle] pathForResource: @"collisionGraph" ofType: @"graphml"]]; 
NSXMLParser* parser = [[[NSXMLParser alloc] initWithData: data] autorelease]; 
[parser setDelegate:self]; 
[parser parse]; <<<<< leak here according to Leaks 
self.currentPass++; 

... 

[parser parse]; 
self.currentPass++; 

我删除了所有的代码从我委托回调方法,但这并没有阻止泄漏。

-(void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName 
namespaceURI:(NSString *)namespaceURI 
qualifiedName:(NSString *)qualifiedName 
    attributes:(NSDictionary *)attributeDict 
{ 
} 

-(void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string 
{ 
} 

-(void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName 
namespaceURI:(NSString *)namespaceURI 
qualifiedName:(NSString *)qName 
{ 
} 

这里是仪器http://i22.photobucket.com/albums/b311/Erithil/ParserLeak.png(联系的,因为我没有代表张贴图片)的观点。

我真的被这个难住,所以任何建议表示赞赏。提前致谢。

+0

你在哪里调用你的NSXMLParser对象的版本?你可以使用调试器或日志声明来验证你的代码调用版本是否实际上正在运行? - [NSXMLParser parse]可能会分配内存,当解析器被释放时,它期望清理内存。 – Ryan 2011-02-23 21:58:46

+0

@Ryan谢谢瑞恩。我的一位同事还建议解析器可能会泄漏,因为autorelease池可能无法及时释放。我测试了用'[parser release]'来调用'autorelease'调用;''在方法结束时。使用调试器,我确认发布的调用正在进行。尽管如此,泄漏仍然存在。 – Dan 2011-02-23 22:43:24

它可能是NSXMLParser内的泄漏(如果xmlCleanupParser()未在基础libxml上调用)或可重用内存被错误标记为泄漏。我认为解析器通常会发生这种情况,因为它们会重用(而不是正确释放?)它们分配的内存。

+0

我明白了。有没有办法确定泄漏是否是真实的(并且如果不告诉泄漏忽略它),还是应该通过使用单独的NSXMLParser对象来解决此问题?谢谢。 – Dan 2011-02-24 04:49:21

+0

我认为使用解决方法是您的最佳选择。 – 2011-02-24 08:01:04

+0

我不认为NSXMLParser有任何规定被要求两次解析文档。期望是你会创建,解析,然后销毁。 – Ryan 2011-02-24 19:31:16