【问题标题】:NSXMLParser Memory Leak from Second Parse Call第二次解析调用导致 NSXMLParser 内存泄漏
【发布时间】:2011-07-03 02:30:35
【问题描述】:

更新:虽然 Leaks 工具指向第一次调用 [parser parse];,但我发现只有在我第二次调用此调用时才会发生泄漏。我在 NSXMLParser 类参考或文档中没有看到任何表明无法重新解析的内容。我错过了什么吗?每次我希望解析文档时是否应该创建一个新的 NSXMLParser?

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

instruments Leaks 工具正在检测以下代码中的泄漏:

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
{
}

这是 Instruments http://i22.photobucket.com/albums/b311/Erithil/ParserLeak.png 中的视图(已链接,因为我没有代表发布图片)。

我真的被这个难住了,所以任何建议都值得赞赏。提前致谢。

【问题讨论】:

  • 你在哪里调用你的 NSXMLParser 对象的释放?您可以使用调试器或日志语句验证您调用 release 的代码实际上正在运行吗? -[NSXMLParser parse] 可能正在分配它希望在解析器被释放时清理的内存。
  • @Ryan 谢谢瑞恩。我的一位同事还建议解析器可能会泄漏,因为自动释放池可能没有及时释放。我测试了用调用“[解析器发布];”替换“自动释放”调用在方法结束时。使用调试器,我确认正在发出发布调用。尽管如此,泄漏仍然存在。

标签: iphone objective-c memory-leaks nsxmlparser


【解决方案1】:

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

【讨论】:

  • 我明白了。有没有办法确定泄漏是否真实(如果不告诉 Leaks 忽略它),还是应该通过使用单独的 NSXMLParser 对象来解决这个问题?谢谢。
  • 我认为 NSXMLParser 没有任何规定可以被要求解析文档两次。期望是您将创建、解析然后销毁。
猜你喜欢
  • 2012-02-12
  • 2011-02-09
  • 1970-01-01
  • 2016-05-09
  • 1970-01-01
  • 1970-01-01
  • 2017-01-13
  • 1970-01-01
  • 2011-02-21
相关资源
最近更新 更多