ARC循环保留检测

10

我将一些旧的代码移植到了Objective-C ARC(自动引用计数),看起来效果很好。但是当一个相当大的高级对象从我的导航栈中弹出时没有被释放,这让我相信我可能在某个地方存在保留环,而ARC已经将其隐藏(或者至少使其难以追踪)。有什么最好的方法来排除这种潜在的保留环和/或确定在ARC下内存泄漏的原因?谢谢!

3个回答

26

我刚刚将一个旧的应用程序转换为使用ARC。仪器没有显示任何泄漏,但是分配继续增加。我发现通过查看我知道该删除的内容的活动对象,我能够追踪到保留了而没有释放的问题。以下是基本步骤:

  1. 使用Instruments中的Allocations工具
  2. 运行你的应用程序一段时间(如果你知道哪些内容没有被释放,这会更快)
  3. 在Allocations跳转栏中将Statistics改为Objects
  4. 按类别排序并找到未释放对象的类名
  5. 找到一个处于活动状态的实例并单击内存地址旁边的小箭头
  6. 现在你可以看到对象的保留和释放历史记录

Instruments中对象历史记录的截图


16

通常最好的方法是使用Instruments应用程序中的泄漏工具(Leaks instrument)

WWDC 2011《Instruments有什么新变化》视频讨论了如何在ARC下使用Instruments查找保留环路,从第38分钟开始介绍。


看起来我找到了!之前有一个块引用是__unsafe_unretained;为了好玩,我把它改成了__weak __block,这似乎解决了问题。注意:Instruments工具没有发现这个问题,也没有标记为潜在的泄漏情况。无论如何,感谢您的建议! - Grimless
哎呀,经过进一步的挖掘,发现泄漏仍然存在。但它只在我将其推入导航堆栈时泄漏......如果我使用-init或-initWithNibName:bundle:,然后将其引用设置为nil,它会正确释放。否则,当我将其推到导航堆栈上然后弹出它时,它永远不会被释放。 - Grimless


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