【问题标题】:NSXMLParser LeakingNSXMLParser 泄漏
【发布时间】:2009-10-21 05:46:48
【问题描述】:

我有以下代码泄漏。 Instruments 说泄漏的是 rssParser 对象。我“刷新”了 XML 提要,它运行了该块并泄漏了......

文件.h

@interface TestAppDelegate : NSObject <UIApplicationDelegate> {

    NSXMLParser *rssParser;

}

文件.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

【问题讨论】:

  • 请注意,三个 setShould* 语句都默认为 NO,因此您可以从代码中删除它们。

标签: iphone memory-leaks nsxmlparser nsxml


【解决方案1】:

Apple 已回复我,这是一个错误 #6469143

看起来他们计划修复 4.0

【讨论】:

  • 你有没有收到苹果关于这个 Bug 的回复?
  • 我得到了与 4.0 中修复的泄漏相同的泄漏
  • 好吧,我仍然在 iOS4 SDK 中看到它。我还没有下载最新的
  • @Phil 我下载了 SDK 4.0.1,但我仍然遇到问题。但是,我可能很笨。
  • 是的,这个漏洞仍然无处不在(我在我的项目中使用了几次 XML 解析器,但我时不时会像疯了一样出现漏洞)。
【解决方案2】:

最可能的原因是您的委托方法之一保留了解析器。你在委托方法中对你的解析器参数做了什么吗?

你每次刷新都会有泄漏吗?

如果这是唯一使用 rssParser 的地方,你为什么要把它变成 ivar?如果您确实需要一个 ivar,我怎么强调始终为它们使用访问器而不是直接访问它们是多么重要。避免内存泄漏的唯一最佳方法是为您的 ivars 使用访问器。

另外,不要在没有立即将其设置为其他内容(通常为 nil)的情况下发布某些内容。您在上面发布的 rssParser 是一个等待发生的崩溃,因为您现在有一个指向可能未分配的内存的指针。

【讨论】:

  • 是的,我确实每次都有泄漏,我已经做了你描述的更改,是的,它不应该是 ivar!还是漏水!
  • 你有 Xcode 3.2(来自 SnowLeopard)吗?构建和分析工具非常擅长发现简单的泄漏。
  • 在板子上一探究竟,这可能是 NSURLConnection 或 NSXMLParser 的缓存问题。你可能想在这方面打开一个雷达。谷歌“nsxmlparser 泄漏”。 iphonedevsdk.com/forum/iphone-sdk-development/…stackoverflow.com/questions/555623/…
  • 谢谢罗伯。当你说打开雷达。这是苹果的错误报告吗?
  • 正确。 bugreport.apple.com 从我从苹果人那里听到的故事中,他们将存放这些东西的原始内部服务器命名为“雷达”,因为通过跟踪所有错误,它应该为人们提供关于新问题的几乎通灵的知识,如 MASH 中的雷达。但这可能只是库比蒂诺的传奇。 CocoaDev 声称它只是意味着“它在 Apple 的雷达上”,但提供的权威甚至比我脆弱的“来自 Apple 的人”还要少。但我还是更喜欢第一个故事。在任何情况下,到 BugReporter 的内部链接都使用 URL 方案 rdar://,并且被广泛称为“雷达”。
【解决方案3】:

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

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

【讨论】:

  • 实际上 Apple 已回复我,此问题已记录为 6469143。但不确定他们何时会修复它。仍然泄漏改变你的做事方式!
【解决方案4】:

我刚刚使用this post 中概述的方法解决了这个问题。

这是一种解决方法,但确实有效。

另一方面,我发现 Instruments 可以在 Lion/Xcode 4.1 中可靠地工作,如果你总是在设备上运行它,而不是在模拟器上运行它。在模拟器上,它似乎有一个附加到进程的时间。

NSXMLParser 实现似乎自然而然地泄漏了。我的应用程序中其他地方的这个库还有另一个泄漏,我需要看看我是否可以确定。这是一个异步调用,这个解决方案似乎对此不起作用。

【讨论】:

    猜你喜欢
    • 2011-02-09
    • 2016-05-09
    • 2011-02-21
    • 1970-01-01
    • 2012-02-12
    • 2011-10-28
    • 1970-01-01
    • 2010-12-24
    • 2011-10-28
    相关资源
    最近更新 更多