1

我已经花了两天时间,但我仍然找不到崩溃的原因。

我知道这与尝试访问已释放的对象有关,但我不知道哪个访问或哪个对象。

每当我谷歌试图找到 EXC_BAD_ACCESS 的来源时,人们建议使用 NSZombies。问题是当我启用僵尸(通过环境变量在 xcode 中或通过 ObjectAlloc 属性在仪器中)时,程序不会在通常发生的地方崩溃,并且僵尸不会报告任何内容(日志中没有任何内容,也没有任何标记仪器)。NSZombie 有什么我缺少的吗?

我尝试利用来自 xcode 的调试器和工具中的 ObjectAlloc 的一些信息,但所有信息都非常神秘,并没有真正帮助我。

我已将调试器设置为在objective-c 异常上停止。当它这样做时,这是显示的调用堆栈:

0 objc_msgSend
1 ??
2 -[UITableViewCell removeFromSuperView]
3 -[UIView dealloc]
... etc ...

首先,'1 ??' 是怎么回事?? 问号是什么意思?其次,我怎么知道在我的代码中调用它的位置?所陈述的所有操作都太通用了(例如 UIView dealloc,但是哪个 UIView?在哪里?)。

此外,当异常发生时,它再次指向汇编代码,这对我没有任何好处,除非我要花费数小时试图弄清楚代码的作用。我知道一些组装,但必须更好的方法......对吗?

有什么方法可以让我获得有意义的信息,说明在异常发生之前我的代码中运行的最后一行是什么?

我尝试在周围散布一些 NSLogs 和断点,但这对我没有多大帮助,因为崩溃发生我从导航控制器弹出视图控制器之后。我放置断点的所有地方都可以很好地达到断点(崩溃后我找不到要中断的点)。只有当我在调试器中“继续”时才会发生异常。就好像崩溃发生在我的代码之外,所以我不知道在哪里处理它。

我查看了我的代码并仔细检查了我是否遵守所有内存管理规则(至少据我所知)。我确定这是非常微妙的东西,但我似乎无法找到它。

如果有人有任何想法如何在没有 NSZombie 的情况下找到此类错误,请分享。

谢谢。

4

1 回答 1

1

好吧,我发现了问题。我有一个自定义表格单元格类,我在 dealloc 方法中首先调用了 [super dealloc](而不是最后一个)。我想我写这门课很着急,并没有真正考虑过。我猜在父母身上释放了孩子需要释放的东西?

所以我对自己的问题没有真正的答案,但基本上我结合使用临时代码跟踪和各种调试技术(断点、NSLogs、试图破译神秘的堆栈跟踪等)发现了问题。

实际上,帮助我的主要策略是一点一点地注释掉代码,直到我将问题区域简化为尽可能简单,同时仍然保持崩溃完好无损。这让我意识到问题不在我想的地方,而是在一个更微妙的领域(例如,在这种情况下,在二级类的 dealloc 方法中)。

我希望这可以帮助某人。如果有人在不依赖 NSZombies 的情况下有更彻底的调试策略,我会暂时不回答这个问题。此外,如果有人可以澄清这两个问号在堆栈跟踪中的含义,那将很有帮助。

于 2010-06-24T16:37:30.670 回答