1

我差不多完成了应用程序,我正在使用工具来分析它。 ARC在解除分配资源时遇到问题,但我不知道是什么。我使用分配工具运行仪器,我正在做的是在主视图中启动应用程序,然后标记一个堆,我稍微与应用程序交互并返回到原始主视图并标记另一堆。可可:寻找释放的缺失参考

我这样做了好几次,据我了解,不应该有任何显着的堆增长,因为我回到了完全相同的地方,我之间做的所有事情都应该被释放,不提供堆增长。然而,我有了显着的增长,所以我潜入堆中,我发现几乎所有东西都有1的保留数,这导致我相信一个对象或视图等不会因为我犯的错误而被释放而那个对象就是所有其他东西的引用。

我试图找出哪些对象没有被释放。仪器非常含糊,只提供不明确的指针,不允许我追溯问题。

请让我知道,如果有,我追查是什么阻碍了可保持保留计数为1

由于参考的方式。

回答

0

我的第一个想法是两件事:
1)你可能有一个保留周期:作为一个例子,一个对象必须给委托一个强有力的参考。而且代表还有一个强大的参考(而不是一个弱引用)返回到第一个对象。由于他们两个“持有”另一个,他们都不能被释放。
2)你可能有一个多线程的应用程序,其中一个线程没有分配autorelease池(即没有0​​块),并且正在创建autorelease对象。即使在返回autorelease对象的简单getter方法中也可能发生这种情况。如果是这样,autorelease对象被“放入”一个不存在的自动释放池(它不会给你一个错误消息,因为你可以发送任何消息到nil),它永远不会被释放。
也许这些情况之一适用于您的问题。

+0

我认为你说的第二个选项可能会发生。虽然我没有明确地创建任何额外的线程,但有时当一个错误弹出为lldb时,我将看到一个显示多个并发线程的视图,但我从未想过太多,我会认为它们是自动创建的更基础的级别的东西。不过,如果这可能是这样,我将如何为我没有创建的线程创建自动释放池? – Elbimio

+0

这很简单:只需将线程代码放在autorelease块中@autoreleasepool {...您的代码...},请参阅

+0

我不知道我的代码中的哪个部分创建了新的线程,就像我说的,我没有明确地调用任何NSThread方法,我只相信我有多个线程,因为当我得到一个lldb错误,显示了几个线程。我怎么知道自动释放块会在我的代码中出现?我从文档所说的几个方面尝试了几个,但似乎没有任何改变。这就是为什么我想缩小到什么具体对象没有被处理。 – Elbimio