Tag Archives: 调试

Zombie Object

Zombie Object是Xcode提供的一种调试手段。在通常情况下,RefCt降为0的对象就会被回收掉。但是在开启了Zombie Object时,RefCt为0的对象不会被立即回收,而是会被标记为Zombie。这样,如果对RefCt为0的对象发起任何消息都会被截获并打印出来,而不是简单的只报EXEC_BAD_ACCESS异常。

在我的模拟器开发环境中,Zombie Object是默认开启的。如果没有开启,可以在Product->Scheme中开启。

开启后,如果对RefCt为0的对象发送任何消息,会提示这种信息:message sent to deallocated instance

我遇到过一个还要复杂一点的问题:

在Release一个NSDictionary对象的时候,我发现他的RefCt是1,并不是0,但还是报了上述错误。经过各种调试,最终发现是NSDictionary容器对象里面的一个子对象被我多释放了一次,在释放NSDictionary的时候,这个子对象的RefCt已经是0了。由于释放任何容器,都会再次激发子对象的Release消息,所以发生了异常。

学到的经验:

  1. 表面上看起来是释放容器出的问题,实际上有可能是容器里面的子对象有问题。
  2. 仔细看Trace信息,里面会告诉你到底是谁出的问题。(被我忽略了,否则会更早发现问题)
  3. Instruments里面的Zombie测试会告诉你关于Zombie Object更详细的信息。