我是iPhone编程的新手,我正在针对乐器中的Leaks工具运行我的应用程序。该工具发现了一些泄漏,所有这些泄漏似乎都指向使用NSXMLParser的类中的1行代码:
- (BOOL)parse{
NSURL *url = [[NSURL alloc] initWithString:@"[url here]"];
NSXMLParser *parser = [[NSXMLParser alloc] initWithContentsOfURL:url];
[parser setDelegate:self];
NSLog(@"NSXMLParser initialized");
[parser parse];
[url release];
[parser release];
return YES;
}
该工具指向创建解析器的行有泄漏:
NSXMLParser *parser = [[NSXMLParser alloc] initWithContentsOfURL:url];
有人能指出我在这个方向上正确的方向吗?我一直在我的代码中查阅引用计数一小时,但没有运气。
更新:
好的,从2个答案中得到建议,我在创建NSURL之前添加了这些行:
[[NSURLCache sharedURLCache] setMemoryCapacity:0];
[[NSURLCache sharedURLCache] setDiskCapacity:0];
我在释放解析器之前添加了这一行:
[parser setDelegate:nil];
每次添加都减少了泄漏次数,现在我减少了2.一个指向CFNetwork,一个指向Foundation作为负责的库。检查两者上的调用堆栈根本不显示任何代码。
还有什么我可能在这里做错了吗?
答案 0 :(得分:1)
我在另一个帖子上找到了这个:
[[NSURLCache sharedURLCache] setMemoryCapacity:0];
[[NSURLCache sharedURLCache] setDiskCapacity:0];
NSXMLParser *parser = [[NSXMLParser alloc] initWithContentsOfURL:URL];
(来源:another stackoverflow topic)
但我没有测试过这个解决方案。
答案 1 :(得分:1)
如果那真的是你的整个代码,那么它确实听起来像底层框架中存在泄漏。请提取您的示例程序和file a bug。
但是,它不是整个代码 - 如果您的委托方法保留了任何内容而不是与发布版本进行平衡,则会导致泄漏。混淆可能是因为当后续retain
可能导致实际泄漏时,泄漏工具会显示对象的分配点。
特别是,使用Object Alloc仪器和泄漏检测,您可以向下钻取以确切了解谁保留和释放任何给定对象。这可能会对情况有所了解。
答案 2 :(得分:1)
您是否尝试在释放之前将解析器的委托设置为nil
?有些班级倾向于保留他们的代表......
修改强>
我实际上并没有看到解析器是NSXMLParser
实例。阅读文档我可以看到他们说:“它不会被保留。”。我还是试一试。
答案 3 :(得分:0)
我有同样的问题,我怀疑泄漏是在底层框架中。
我改变了我的代码:
NSXMLParser * parser = [[NSXMLParser alloc] initWithContentsOfURL:fileName];
到此:
NSData * fileData = [[NSData alloc] initWithContentsOfURL:fileName];
NSXMLParser * parser = [[NSXMLParser alloc] initWithData:fileData];
[parser setDelegate:self];
[parser parse];
[parser release];
[fileData release];
泄漏消失了。