【问题标题】:Instruments does not show me the real reference countInstruments 没有显示真正的参考计数
【发布时间】:2012-03-05 18:30:37
【问题描述】:

我正在尝试调试一个对象被释放太多次然后被事件循环释放的问题。下次我尝试从对象中读取时,应用程序会因 EXC_BAD_ACCESS 而崩溃。

为了调试,我启用了 NSZombies,然后将 Zombies 配置文件与 Instruments 一起使用。然后,我的应用程序崩溃了,Instruments 通知我一条消息正在发送到一个已释放的实例。到目前为止,一切顺利。

它很好地向我展示了 UIKit 等库在哪里释放和保留指向我的对象的指针,但它没有向我展示我自己的代码在哪里执行此操作。它也没有显示真实的引用计数。当 Instruments 说引用计数为 1 时,根据在 gdb 中打印出引用计数,引用计数实际上是 8。

我已经调查了 Instruments 以某种方式过滤输出的可能性,但看起来我确实在记录每个发布和保留事件。它绝对必须在我的应用程序中,因为我的视图控制器在显示后立即被释放,这意味着尝试执行任何会向控制器发送消息的操作都会导致它崩溃。

在dealloc方法中放置断点后,我发现我的对象确实被事件循环释放了,所以这不是其他东西对dealloc的恶意调用。

【问题讨论】:

  • 发布您要实例化 ViewController 的代码。

标签: objective-c xcode ios5 instruments


【解决方案1】:

您不能依赖引用计数,因为 Apple 的框架类可能拥有自己对您的对象的引用。引用计数对调试没有意义。

【讨论】:

  • 确实如此。据我所知,我已经看到对应该只有一两个的对象的引用计数很高。但在幕后,你会得到更多,尤其是在检测时。但即使没有 Instruments,计数通常也比您想象的要高得多(但绝不会低)。
  • 当然这两个数字应该匹配? Instruments 是否看不到 Apple 框架内部的发布和保留?你知道为什么 Instruments 没有记录我的软件为释放和保留而发出的调用吗?
  • 我在几个小时后解决了这个问题,但忘了更新 - 事实上,我已经将文件的所有者设置为我的自定义 ViewController,并在 nib 中设置了一个 TableViewController 为相同的 ViewController,因此我感到困惑。这最终创建了同一个 ViewController 的两个实例;下次事件循环运行时,其中一个很快就被吃掉了。然而,UI 中的所有操作都附加到这个现在已解除分配的实例上,因此发生了崩溃。感谢您抽出宝贵时间阅读和回答我的问题,并在我身上享有盛誉。
【解决方案2】:
  1. 单击分配图左侧的 (i)
  2. 设置“记录引用计数”
  3. 你完成了;)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-10
    • 2013-02-04
    • 2015-02-05
    • 2018-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多