【问题标题】:Cocoa: Finding the missing reference for deallocatingCocoa:寻找释放的缺失参考
【发布时间】:2013-07-29 17:23:02
【问题描述】:

我几乎完成了应用程序,我正在使用工具对其进行分析。我在 ARC 释放某些东西时遇到问题,但我不知道是什么。我使用分配工具运行工具,我正在做的是在主视图启动应用程序,然后我标记一个堆,我与应用程序交互一点,然后返回到原始主视图并标记另一个堆。

我这样做了几次,据我了解,不应该有任何显着的堆增长,因为我回到了完全相同的地方,我在这之间所做的一切都应该被释放,没有提供任何堆增长。但是我有显着的增长,所以我深入研究堆,我发现它上面的几乎所有东西的保留计数都是 1,这让我相信一个对象或视图等由于我犯了一个错误而没有被释放并且该对象是对其他所有内容的引用。

我试图找出哪个对象没有被释放。 Instruments 非常含糊,只提供不让我追溯问题的晦涩指针。

请让我知道是否有办法让我跟踪持有可能将保留计数保持在 1 的引用。

谢谢。

【问题讨论】:

    标签: cocoa automatic-ref-counting instruments dealloc retaincount


    【解决方案1】:

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

    【讨论】:

    • 我认为您所说的第二个选项可能正在发生。虽然我没有明确创建任何额外的线程,但有时当错误弹出为 lldb 时,我会看到一个显示多个同时线程的视图,我从来没有想过它,我认为它们是自动创建的,用于更基本的水平的东西。如果可能是这样,我将如何为我没有创建的线程创建一个自动释放池?
    • 这很简单:只需将线程的代码包含在一个自动释放块中 @autoreleasepool {...your code...},请参阅 developer.apple.com/library/ios/#documentation/cocoa/Conceptual/…>
    • 我不知道在我的代码的哪个部分创建了新线程,就像我说的,我没有显式调用任何 NSThread 方法,我只相信我有多个线程,因为当我得到显示了多个线程的 lldb 错误。我如何知道自动释放块在我的代码中的哪个位置?我从文档中尝试了几个,但似乎没有任何改变。这就是为什么我想缩小到没有被释放的特定对象。
    • 创建线程的方法有很多种。最常见的是对 performSelectorInBackground:、performSelector:withObject:afterDelay: 的调用,以及将某些内容放入 Grand Central Dispatch 系统的调度队列中。如果您使用其中一些,在大多数情况下,有必要通过 @autoreleasepool 块将您的代码包含在选择器中。
    • 我正在尝试找到创建单独线程的所有方法的最终列表,以查看我是否正在使用它们中的任何一个。似乎找不到类似的东西,而且我的代码中没有任何明显的东西。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多