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];
这是我的解析代码,泄漏工具显示泄漏。我真的不知道什么是错的或如何解决这个问题。有什么建议?
答案 0 :(得分:3)
parser = nil;
[parser release];
......这不符合你的想法。假设parser
是一个属性,那么self.parser = nil
和parser = nil
会做很多不同的事情。前者将调用parser
setter方法,该方法将释放旧值并将属性设置为nil。后者只是将指针从当前位置更改为nil。
通过将指针设置为nil,您已经丢失了对该对象的引用,因此您立即泄漏了之前分配给它的对象 - 您基本上是在尝试释放一个nil对象。您需要移除nil
来电,或将其放在release
之后(见下文)。
您可能正在考虑在发布之后设置指向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是否解决了问题(如果它确实是一个已知的泄漏)
编辑:我现在有兴趣看看我是否犯了上述错误!