The Inner Life Of Zombies
有人建议我探讨一下NSZombie
的工作原理.
Zombie概述
一个Objective-C对象是一块已分配好的内存。
其内部的第一个对象是一个isa
指针,指向对象的类。
块的其余的部分包含了所指对象的成员。
当一个对象被销毁时,它占有的内存块就会被释放。通常这只是意味着它会被标记,以便重新使用。如果你糊涂地保留了一个指向它的指针,那可能会发生无法预料的奇怪事情。
某些情况下,你的使用这些已被销毁的对象的代码会正常工作。如果这些被标记为已销毁的内存没有被覆盖之前,如同一个正常的Objective-C对象一样。
这些已被标记为可销毁的对象,可能被一个新对象覆盖,如果这时使用一个旧的指针来发送消息到新的对象上,会发现令人困惑的结果。
然而在某些情况下,这些内存被覆盖,但不是一个对象,这时你的代码会导致crash。但这些错误最快的会告诉你什么出错了。
Zombies(僵尸)
极大的改善了这种情况。 相比于简单的放置被销毁的对象内存不管,zombies
接管了它,把它替换为一个可以追踪所有试图访问它的对象。这就是术语Zombie
:死去的对象被复活成为一个不死的东西。当一个zombie对象接收到消息,它会记录它,并崩溃,提供一个方便的回溯跟踪,这时你便可以清楚的找到问题根源。
Zombies的使用
设置环境变量NSZombieEnabled
为YES
即可开启Zombies。但是注意一点,zombies默认为永远不会被释放,所以你的app的内存量使用会变得异常的高。
另一个有用的选项就是在Instruments中的Zombies Instruments. 它这不仅打开了zombies,还能跟踪对象的引用计数。