XMLParser泄漏仪器泄漏

XMLParser泄漏仪器泄漏

问题描述:

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]; 

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

我有使用NSXMLParser类似的问题,但发现一个简单的修复程序来解决内存泄漏。

而不是做

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

执行以下操作

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

我能够摆脱我的记忆中的泄漏

parser = nil; 
[parser release]; 

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

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

您可能会考虑在之后设置一个指向nil的指针,以避免在将来尝试访问它时出现问题。

这里有一些其他的问题,以帮助提供一些背景:

release Vs nil -- Best Practice

Difference between release and release then set to nil

+0

我将它改写到一个班轮:'[解析释放],解析器=零;'。虽然它是本地范围,但并不需要将指针设置为'nil' – Joost

+0

确实 - 我个人只将属性设置为零,而不是局部变量。而且,正如Simon在他的回答中所建议的,这不会解决解析器本身的泄漏问题! – lxt

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

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

+0

所以你建议我留下蜜蜂。让我的应用程序泄漏? – Spire