NSXMLParser泄漏

9
我有以下泄漏的代码。Instruments显示泄漏对象是rssParser。我“刷新”XML源并运行块后,它会泄漏。
文件.h
@interface TestAppDelegate : NSObject <UIApplicationDelegate> {

    NSXMLParser *rssParser;

}

file.m

NSData *data = [ NSURLConnection sendSynchronousRequest:request returningResponse: nil error: nil ];
    rssParser = [[NSXMLParser alloc] initWithData:data];
    [rssParser setDelegate:self];
    [rssParser setShouldProcessNamespaces:NO];
    [rssParser setShouldReportNamespacePrefixes:NO];
    [rssParser setShouldResolveExternalEntities:NO];
    [rssParser parse];
    [rssParser release];

内存泄漏的图像....

alt text http://www.shipfinder.co.uk/images/memoryleak.png


1
请注意,这三个setShould*语句默认值已经为NO,因此您可以从代码中删除它们。 - Epsilon Prime
4个回答

10

苹果已经回复我了,这是个bug#6469143

看起来他们计划在4.0版中修复


你收到苹果关于这个 Bug 的回复了吗? - Louis Russell
2
我遇到了同样的泄漏问题,这个泄漏在4.0中修复了吗? - kiri
1
我仍然在iOS4 SDK中看到它。我还没有下载最新的版本。 - philsquared
@Phil,我下载了SDK 4.0.1,但仍然存在问题。但是,可能是我太蠢了。 - Dustin Scaggs
是的,我仍然在整个项目中遇到内存泄漏问题(我在项目中使用了几次XML解析器,有时会出现大量泄漏)。 - geerlingguy

3
最可能的原因是你的代理方法中有一个保留了解析器。你是否在代理方法中对解析器参数做了任何操作?
每次刷新都会出现泄漏吗?
如果这是rssParser唯一使用的地方,为什么要将其作为实例变量?如果确实需要实例变量,我无法强调使用访问器以及绝不直接访问它们的重要性。避免内存泄漏的最佳方法是对实例变量使用访问器。
此外,永远不要释放某些东西而不立即将其设置为其他东西(通常是nil)。你上面对rssParser的释放是一种等待崩溃的行为,因为你现在有一个指向潜在未分配内存的指针。

是的,每次我都会出现泄漏,我已经按照您描述的更改进行了更改,是的,它不应该是ivar!但仍然有泄漏! - Lee Armstrong
你有SnowLeopard里的Xcode 3.2吗?Build and Analyze工具非常擅长发现简单的内存泄漏。 - Rob Napier
在论坛上搜索,这可能是NSURLConnection或NSXMLParser的缓存问题。您可能需要在此方面开启一个雷达。谷歌“nsxmlparser leak”。http://www.iphonedevsdk.com/forum/iphone-sdk-development/4910-nsxmlparser-rssparser-causing-memory-leak.html http://stackoverflow.com/questions/555623/got-memory-leak-problem-when-i-used-nsxmlparser-same-as-seismicxml-example - Rob Napier
谢谢Rob。当你说打开一个雷达时,是指向苹果报告一个错误吗? - Lee Armstrong
正确。bugreport.apple.com 根据我从苹果员工那里听到的故事,他们将最初存储这些内容的内部服务器命名为“radar”,因为通过跟踪所有错误,它应该能够让人们几乎能够像MASH中的雷达一样对新问题有心理预知能力。但这可能只是库比蒂诺的传说。CocoaDev声称它只是意味着“它在苹果的雷达上”,但提供的权威性甚至不如我的脆弱的“来自苹果员工”的说法。但我仍然更喜欢第一个故事。无论如何,指向BugReporter的内部链接使用URL方案rdar://,并被广泛称为“radars”。 - Rob Napier

0

这似乎是一个众所周知的问题。在这里查看NSURLConnection leaking。 但是,如果在初始化解析器之前设置以下内容,则泄漏将停止:

[[NSURLCache sharedURLCache] setMemoryCapacity:0];
[[NSURLCache sharedURLCache] setDiskCapacity:0];
NSXMLParser *parser = [[NSXMLParser alloc]initWithContentsOfURL:URL];

事实上,苹果已经回复了我,并且将此问题记录为 6469143。不过,我不确定他们何时会修复它。尽管如此,我仍然在尝试按照你的方式进行改进! - Lee Armstrong

0

我刚刚通过使用这篇文章中概述的方法来解决了这个问题。

这是一个变通方法,但它有效。

另外,我发现如果你总是在设备上运行Instruments,而不是模拟器,它在Lion/Xcode 4.1中可以可靠地工作。在模拟器上,它似乎很难附加到进程上。

NSXMLParser实现似乎天然泄漏。我的应用程序中还有另一个来自该库的泄漏,我需要看看能否确定其位置。那是一个异步调用,这个解决方案似乎对它不起作用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接