在这个Objective-C NSXMLParser代码中找不到泄漏?

时间:2010-02-19 17:49:44

标签: iphone objective-c cocoa-touch

我是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作为负责的库。检查两者上的调用堆栈根本不显示任何代码。

还有什么我可能在这里做错了吗?

4 个答案:

答案 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];
泄漏消失了。