8

我有一些对象被传递给我的应用程序中的许多不同的视图和控制器。当我期望它们被释放时,它们并没有被释放。显然某处有一个错误的强指针,但它可能存在的表面积非常大——这些对象被移入和移出许多不同的数据结构。

我通常的首选解决方案是泄漏(不报告任何周期)和分配(列出该对象的 500 多个保留/释放)。有什么办法可以减少我的搜索空间吗?

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

4

2 回答 2

19

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

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

于 2013-03-28T17:38:51.687 回答
0

识别是否存在保留周期的最简单方法,只需在控制器的dealloc()/ deinit()(swift) 方法中放置一个断点,并且每当您弹出控制器时,如果控制器中存在保留周期,则检查此方法是否被调用,此方法获胜不要被叫。

迅速

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

目标 C

- (void)dealloc {

    NSlog("Memory to be released soon");

}

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

于 2017-04-16T06:35:37.090 回答