我已经花了两天时间,但我仍然找不到崩溃的原因。
我知道这与尝试访问已释放的对象有关,但我不知道哪个访问或哪个对象。
每当我谷歌试图找到 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 的情况下找到此类错误,请分享。
谢谢。