【问题标题】:ARC circular retain detectionARC圆形保留检测
【发布时间】:2012-02-04 08:48:58
【问题描述】:

我将一些旧代码移植到 Objective-C ARC(自动引用计数),它似乎工作得很好。除了一个相当大的高级对象从我的导航堆栈中弹出时没有被释放,这让我相信我在某个地方有一个 ARC 对我隐藏的保留周期(或者至少难以追踪)。清除此潜在保留周期的最佳方法是什么和/或确定 ARC 下内存泄漏原因的好方法是什么?谢谢!

【问题讨论】:

    标签: iphone objective-c ios xcode automatic-ref-counting


    【解决方案1】:

    我刚刚将一个较旧的应用转换为使用 ARC。仪器显示没有泄漏,但分配继续增加。我发现通过查看我知道应该删除的活动对象,我能够在不释放的情况下追踪保留。以下是基本步骤:

    1. 在 Instruments 中使用分配工具
    2. 用你的应用玩一会儿(如果你知道什么没有发布,这会更快)
    3. 将统计信息更改为分配跳转栏中的对象
    4. 按类别排序并找到未发布对象的类名
    5. 找到一个活的实例,然后点击内存地址旁边的小右箭头
    6. 现在您可以查看对象的保留和释放历史记录

    【讨论】:

      【解决方案2】:

      最好的方法通常是使用the Leaks instrument in the Instruments app

      来自WWDC 2011What's New In Instruments 视频讨论了使用 Instruments 在 ARC 下查找保留周期,从大约 38 分钟开始。

      【讨论】:

      • 看来我找到了!有一个 __unsafe_unretained 的块引用;将其更改为 __weak __block for lols,这似乎已经修复了它。注意:仪器没有发现这一点,并且确实没有将其标记为潜在的泄漏情况。无论如何感谢您的建议!
      • 哎呀,经过一些额外的挖掘,发现泄漏仍然存在。但它只会在我将它推送到导航堆栈时泄漏......如果我使用 -init 或 -initWithNibName:bundle:,然后它的引用为零,它会正确解除分配。否则,当我将它推送到导航堆栈然后弹出它时,它永远不会释放。
      【解决方案3】:
      猜你喜欢
      • 2017-05-24
      • 2016-06-01
      • 2011-03-09
      • 2014-12-23
      • 1970-01-01
      • 1970-01-01
      • 2017-07-01
      • 2013-01-28
      • 1970-01-01
      相关资源
      最近更新 更多