【发布时间】: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