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

时间:2013-02-07 18:41:46

标签: ios objective-c automatic-ref-counting instruments

我的应用程序中有一些传递给很多的不同视图和控制器的对象。当我期待它们时,它们不会被解除分配。显然,某处有一个错误的强指针,但它可能存在的表面区域非常大 - 这些对象被移入和移出许多不同的数据结构。

我通常的解决方案是Leaks(报告没有周期)和Allocations(列出此对象的500多个保留/释放)。有没有办法减少我的搜索空间?

理想情况下会有一个工具可以让我输入一个指针并查看对象的所有强引用,我可能会在列表中注意并在大约60秒内找到额外的引用。实际上,有一种工具 - 对象图形工具 - 但它不适用于iOS软件。

2 个答案:

答案 0 :(得分:19)

您需要分配工具。要跟踪单个对象类型,请启动该应用程序。您需要在每个重要事件中创建一个快照(我通常在您刚刚转换到视图控制器或从视图控制器转换时创建它们)。

一旦你有一个应该有你想要跟踪的对象的快照,那么你应该能够在快照的显示三角形下找到该对象类型。对于该类型的每个对象,您可以通过单击该对象行中的箭头来获取已发送到该对象的保留和释放的历史记录。

答案 1 :(得分:0)

通过在控制器dealloc() / deinit()(swift)方法中设置断点以及每次弹出控制器时确定是否存在保留周期的最简单方法如果控制器中存在保留周期,则调用与否的方法不会调用此方法。

<强>夫特

deinit {
    print("Memory to be released soon")
}

目标C

- (void)dealloc {

    NSlog("Memory to be released soon");

}

如果您想获得有关强引用和根本原因的更多详细信息,您应该使用Instrument作为另一个答案。