如何debugging“消息发送到解除分配的实例”在Xcode4?

我按下了ALT + CMD + R,并在参数>环境variables中激活NSZombieEnabled。 另外,我在诊断>内存pipe理>启用僵尸对象中激活了它。

但是,当我build立和运行,在某个时候我的应用程序崩溃在控制台给我这个无用的消息:

*** -[CALayer retainCount]: message sent to deallocated instance 0x656b260 

堆栈跟踪一样无用。 我一直把细节级别的滑块移到右边。 线程1简单地告诉我这个:

截图

一切都是系统拥有的,没有一行与我的应用程序相关。 所以显然NSZombiesEnabled不像Xcode 3那样工作,在死的对象上停止。

有什么方法可以确定哪个 CALayer被释放得太早?

更新:所以在build立和运行大约100多次后突然问题失踪了! 它完全消失了! 而最好的部分:我没有以任何方式修改我的代码! 在这之间,我清理了build文件夹,并使用clean命令多次执行了项目,并且还多次在Simulator中删除了该应用程序。

更新2:幸好问题重新出现。 现在似乎持久。 幸运的是,我更喜欢find根本原因,而不是随意挑剔用户。

更新3:最后偶然发现:

 startButton = newBttn; 

本来应该:

 self.startButton = newBttn; 

startButton是一个保留的属性,并在-dealloc我释放它。 所以它被过度释放,并在大多数(但不是全部)的情况下,视图淡出后,坠毁给奇怪的CALayer retainCount消息。

僵尸工具(CMD + I)最后指出,它必须做一个button。 只是不知道为什么和在哪里。

铛静态分析仪没有抱怨这个明显的故障。

如果再次出现,你可以运行一个专门的僵尸工具。 按命令+我来分析应用程序,并select僵尸工具(你必须在模拟器上运行)。 如果你有一个僵尸,你可以显示整个记忆历史(每个保留/释放)该对象,这是非常有用的追查错误。

除了杰夫的很好的答案, 做几乎相同的事情,但不必打开仪器或configuration文件您的应用程序,您可以在debugging器中设置NSZombieEnabled , MallocStackLogging ,并警卫malloc 。 然后,当你的应用程序崩溃时,在gdb控制台中input:

 (gdb) info malloc-history 0x543216 

用导致崩溃的对象的地址replace0x543216 ,您将得到一个更有用的堆栈跟踪,它应该可以帮助您find导致问题的代码中的确切行。

这篇文章有一些额外的信息。