【问题标题】:memory leaks appearing after multiple loading多次加载后出现内存泄漏
【发布时间】:2010-01-25 23:18:15
【问题描述】:

至少对我来说,这里有一个奇怪的情况:我有一个相对简单的程序,它从 Web 加载 XML 文件,解析它并将数据写入字典数组。每个字典代表表中的一行。该程序运行良好,如果我将模拟器连接到仪器并加载列表,则不会出现内存泄漏。

现在是奇怪的部分:有一个按钮供用户重新加载列表。如果按下它,之前的数据被清除,新下载并解析的 XML 等等。如果我按下这个按钮,我仍然找不到内存泄漏。然而,如果我按两次,突然周围有泄漏。我很纳闷,以前没有的地方怎么突然出现泄漏(只有运行两次相同的代码才会出现泄漏)?这特别奇怪,因为我正在使用 Apple 的示例 XMLParser 的一部分,例如,我的代码是他们的 1:1 副本,但是当我运行解析器两次时,仪器报告此代码中的泄漏。

我很高兴得到任何帮助,我几乎不知道如何解决这个问题。代码应该没问题。我已经尝试过“构建和分析”,它也不会揭示我在仪器中看不到的任何东西。

一切顺利,罗宾

【问题讨论】:

  • 我们应该神奇地猜出是什么原因造成的?
  • 不,你绝对不能这样做。我只是想知道其他人以前是否遇到过这个问题以及泄漏是否真的是泄漏(但我猜他们是)。泄漏非常多且广泛,因此我不得不发布一半的项目,这对您也无济于事。
  • 发布一些代码...至少是按钮处理程序代码。
  • 您使用什么来检测这些“泄漏”?

标签: iphone objective-c memory-leaks instruments


【解决方案1】:

这里确实没有足够的信息来做出可靠的答案。

也就是说,听起来您可能误解了您正在使用的内存泄漏检测工具的结果。如果它正在扫描对象图以查找孤立对象,则在重新加载之前它可能不会注意到对象是孤立的。这是因为在您正在使用的第 3 方库之一中(或在您自己的代码中)可能存在对对象图根的静态缓存引用。重新加载后,缓存的引用将移至新根对象和所有旧对象不再被任何根变量(调用堆栈上的局部变量或静态变量)引用,因此是孤立的和“泄露”的。

【讨论】:

  • 非常感谢,这听起来很有趣。我完全理解,只要你没有代码,你就无法给出详细的解决方案,但是有没有办法检测这些缓存对象是否被使用(例如,有没有可能打开这个缓存?)谢谢非常感谢您的意见!
【解决方案2】:

该程序运行良好,如果我附上 我的仪器和负载模拟器 列表,没有内存泄漏。

这并不意味着您没有泄漏 - 仪器可能无法捕捉到它们 - 它每 n/秒采样一次。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-11-22
    • 2011-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多