XMLParser泄漏仪器泄漏

时间:2011-08-24 13:34:32

标签: iphone memory-leaks nsxmlparser

NSURL *url = [[NSURL alloc] initWithString:@"http://www.someurl.com/sample.xml"];
xmlParser = [[NSXMLParser alloc] initWithContentsOfURL:url];
[url release];

XMLParser *parser = [[XMLParser alloc] initXMLParser];        //50.0%


[xmlParser setDelegate:parser];
parser = nil;
[parser release];

[xmlParser parse];                                           //50.0%
[xmlParser release];

这是我的解析代码,泄漏工具显示泄漏。我真的不知道什么是错的或如何解决这个问题。有什么建议?

3 个答案:

答案 0 :(得分:3)

parser = nil;
[parser release];

......这不符合你的想法。假设parser是一个属性,那么self.parser = nilparser = nil会做很多不同的事情。前者将调用parser setter方法,该方法将释放旧值并将属性设置为nil。后者只是将指针从当前位置更改为nil。

通过将指针设置为nil,您已经丢失了对该对象的引用,因此您立即泄漏了之前分配给它的对象 - 您基本上是在尝试释放一个nil对象。您需要移除nil来电,或将其放在release之后(见下文)。

您可能正在考虑在发布之后设置指向nil 的指针,以防止在将来某个时候尝试访问它时出现问题。

以下是一些其他问题,以帮助提供一些背景信息:

release Vs nil -- Best Practice

Difference between release and release then set to nil

答案 1 :(得分:2)

我在使用NSXMLParser方面遇到过类似的问题,但是找到了解决内存泄漏问题的简单方法。

而不是做

xmlParser = [[NSXMLParser alloc] initWithContentsOfURL:url];

执行以下操作

NSData *xmlData = [NSData dataWithContentsOfURL:[NSURL URLWithString:url]]; 
xmlParser = [[NSXMLParser alloc] initWithData:xmlData];

我能够摆脱我的内存泄漏

答案 2 :(得分:0)

解析器中有关于泄漏的similar post here。我也有这个问题。它很烦人,但它不是一个巨大的泄漏,所以我不太担心它。将看看iOS 5是否解决了问题(如果它确实是一个已知的泄漏)

编辑:我现在有兴趣看看我是否犯了上述错误!