ARC圆形保留检测
Posted
技术标签:
【中文标题】ARC圆形保留检测【英文标题】:ARC circular retain detection 【发布时间】:2012-02-04 08:48:58 【问题描述】:我将一些旧代码移植到 Objective-C ARC(自动引用计数),它似乎工作得很好。除了一个相当大的高级对象从我的导航堆栈中弹出时没有被释放,这让我相信我在某个地方有一个 ARC 对我隐藏的保留周期(或者至少难以追踪)。清除此潜在保留周期的最佳方法是什么和/或确定 ARC 下内存泄漏原因的好方法是什么?谢谢!
【问题讨论】:
【参考方案1】:我刚刚将一个较旧的应用转换为使用 ARC。仪器显示没有泄漏,但分配继续增加。我发现通过查看我知道应该删除的活动对象,我能够在不释放的情况下追踪保留。以下是基本步骤:
-
在 Instruments 中使用分配工具
用你的应用玩一会儿(如果你知道什么没有发布,这会更快)
将统计信息更改为分配跳转栏中的对象
按类别排序并找到未发布对象的类名
找到一个活的实例,然后点击内存地址旁边的小右箭头
现在您可以查看对象的保留和释放历史记录
【讨论】:
【参考方案2】:最好的方法通常是使用the Leaks instrument in the Instruments app。
来自WWDC 2011 的 What's New In Instruments 视频讨论了使用 Instruments 在 ARC 下查找保留周期,从大约 38 分钟开始。
【讨论】:
看来我找到了!有一个 __unsafe_unretained 的块引用;将其更改为 __weak __block for lols,这似乎已经修复了它。注意:仪器没有发现这一点,并且确实没有将其标记为潜在的泄漏情况。无论如何感谢您的建议! 哎呀,经过一些额外的挖掘,发现泄漏仍然存在。但它只会在我将它推送到导航堆栈时泄漏......如果我使用 -init 或 -initWithNibName:bundle:,然后它的引用为零,它会正确解除分配。否则,当我将它推送到导航堆栈然后弹出它时,它永远不会释放。【参考方案3】:X-code 8 引入内存图调试工具:
在这里查看完整参考:
https://developer.apple.com/library/content/documentation/DeveloperTools/Conceptual/debugging_with_xcode/chapters/special_debugging_workflows.html#//apple_ref/doc/uid/TP40015022-CH9-DontLinkElementID_1
【讨论】:
以上是关于ARC圆形保留检测的主要内容,如果未能解决你的问题,请参考以下文章