ARC中过度保留的调试策略是什么?

8
我有一些对象被传递到应用程序的许多不同的视图和控制器中。它们没有在我期望它们被释放时被释放。显然,有一个错误的强指针存在,但是它可能存在的表面积很大 - 这些对象被移动到和从许多不同的数据结构中。
我的常规解决方案是使用Leaks(它报告没有循环)和Allocations(它列出了500多个对该对象的保留/释放)。有没有办法减少我的搜索范围?
理想情况下,有一个工具可以让我输入一个指针,并查看所有对该对象的强引用,我可能只需要60秒就能找到额外的引用。实际上,这样的工具确实存在 - Object Graph工具 - 但它在iOS软件中不可用。

1
请参见https://dev59.com/_Wox5IYBdhLWcg3wi0zF?rq=1 - Leaks可以发现保留循环。如果它没有发现任何问题,那么您可能仍然在应用程序中从某个地方访问了一些强引用。 - MrMage
2
那些强引用正是我正在寻找的。 - Drew
2个回答

19

您需要使用Allocations工具。要跟踪一个特定的对象类型,请启动应用程序。您需要在每个重要事件(我通常在刚刚转换到或从视图控制器时创建它们)创建一个heapshot。

一旦您获得了一个heapshot,其中应该包含您感兴趣的对象,那么您应该能够在heapshot的展开三角形下找到该对象类型。对于该类型的每个对象,您可以通过单击该对象行中的箭头来获取发送给该对象的保留和释放历史记录。


这应该是被接受的答案 - 救了我的命! - Nick Farina

0
最简单的方法来识别是否存在保留循环是在您的控制器的dealloc()/deinit()(Swift)方法中设置断点,每当您弹出控制器时,请检查这些方法是否被调用,如果您的控制器中存在保留循环,则这些方法不会被调用。
deinit {
    print("Memory to be released soon")
}

Objective C

- (void)dealloc {

    NSlog("Memory to be released soon");

}

如果你想了解更多关于强引用和根本原因的细节,你应该选择使用Instrument,就像其他答案所提到的一样。


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