iOS:如何调试“发送到已释放实例的消息”

Posted

技术标签:

【中文标题】iOS:如何调试“发送到已释放实例的消息”【英文标题】:iOS: How to debug "message sent to deallocated instance" 【发布时间】:2013-12-17 01:28:15 【问题描述】:

我的 ios 应用出现问题。这是我针对相关组件的票证:https://github.com/lxcid/LXReorderableCollectionViewFlowLayout/issues/52

但对于 *** - 我的问题更笼统。如何调试这样的东西?

我得到的唯一错误是:

2013-12-16 18:23:24.307 3rdRevolution[33315:70b] *** -[CFSet countByEnumeratingWithState:objects:count:]: message sent to deallocated instance 0x1336f850
(lldb) 

这是xcode的截图:

我确实发现 LXReordableCollectionView 通过注释掉解决崩溃的用法来参与崩溃。但我仍然不知道为什么或如何解决它。注释掉代码来解决问题似乎不是一个好方法..

建议?

谢谢!

【问题讨论】:

悬空指针的例子。之前分配在 0x1336f850 的实例已被释放,因此不再可用。启用僵尸。请参阅***.com/questions/5386160/… 了解更多信息。 @Till 我认为这个错误信息的存在意味着他已经开启了僵尸。 正确,僵尸已经开启。 添加异常断点将帮助您确定异常发生的位置或释放的变量。 @philswenson 这是 ARC 代码吗?如果没有,静态分析器(Xcode 的“产品”菜单上的“分析”)对于发现非 ARC 代码中的问题非常有用。 【参考方案1】:
    如果是您自己的自定义类,请将 NSLog 放入 dealloc。如果没有,请对您正在使用的类进行子类化,使用 [super dealloc] 和 NSLog 覆盖 dealloc。 确定对象何时被准确释放。 然后找出它被释放的原因。

【讨论】:

这是一个很酷的答案。当你的类是神秘的东西时怎么样: NSISRestrictedToNonNegativeVariable ?【参考方案2】:

我在 Scheme Diagnostics 中启用了 Zombies,并找出了导致错误的类(它是一个视图控制器)。

它释放了一个已经被释放的类实例,这在 ARC 项目中很奇怪,所以它让我很难过。

原来我忽略了一个警告。我有一个应该返回值但没有返回的方法。

一旦我纠正了那个错误,崩溃就停止了。

【讨论】:

以上是关于iOS:如何调试“发送到已释放实例的消息”的主要内容,如果未能解决你的问题,请参考以下文章

发送到已释放实例的消息

[UIImageAsset 保留]:发送到已释放实例的消息

[UINavigationController 保留]:发送到已释放实例的消息

发送到已释放实例的消息

tableView:didSelectRowAtIndexPath - 发送到已释放实例的消息

iPhone - SKProductsRequest 和“发送到已释放实例的消息”