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 = nil
和parser = nil
做了非常不同的事情。前者将调用parser
setter方法,该方法将释放旧值并将属性设置为零。后者只是将指针从当前位置改为零。
通过将指针设置为零,您已经失去了对该对象的引用,因此您立即泄露了之前分配给它的对象 - 您基本上正在尝试释放一个零对象。您需要删除nil
呼叫,或将其放在release
(见下文)之后。
您可能会考虑在之后设置一个指向nil
的指针,以避免在将来尝试访问它时出现问题。
这里有一些其他的问题,以帮助提供一些背景:
有一个similar post here关于解析器泄漏。我也有这个问题。这很烦人,但它不是一个巨大的泄漏,所以我不担心太多。将看看如果iOS 5修复了问题(如果它确实是一个已知的泄漏)
编辑:我现在有兴趣看看我是否犯了上述错误!
所以你建议我留下蜜蜂。让我的应用程序泄漏? – Spire
我将它改写到一个班轮:'[解析释放],解析器=零;'。虽然它是本地范围,但并不需要将指针设置为'nil' – Joost
确实 - 我个人只将属性设置为零,而不是局部变量。而且,正如Simon在他的回答中所建议的,这不会解决解析器本身的泄漏问题! – lxt