首先我们来看下Xcode中僵尸对象是如何实现的,具体操作步骤可以参考这篇文章iOS Zombie Objects(僵尸对象)原理探索 从dealloc的源码中,我们可以看到“Replaced by NSZombie...”,即对象释放时, NSZombie 将在 dealloc 里做替换,如下所示 image 所以僵尸对象的生成过程伪代码如下 //1、获取到即将deallocted对象所属类...self); //2、获取类名 const char *clsName = class_getName(cls) //3、生成僵尸对象类名 const char *zombieClsName = "_NSZombie...zombieCls) { //5、获取僵尸对象类 _NSZombie_ Class baseZombieCls = objc_lookUpClass(“_NSZombie_");...Class cls = object_getClass(self); //2、获取对象类名 const char *clsName = class_getName(cls); //3、检测是否带有前缀_NSZombie
(lldb) po (Class)0x0283cb0bd3 _NSZombie_UILabel (lldb) p/t 0x0283cb0bd3 (long) $10 = 0b0000000000000000000000000000001010000011110010110000101111010011...Zombie 机制大概是在对象 dealloc 时把对象的 isa 类部分指向一个新的类(比如这里的 _NSZombie_UILabel),后续再向该对象发送消息就会被拦截下来报错,所以对象地址不会变
就是当设置NSZombieEnabled环境变量后,一个对象销毁时会被转化为_NSZombie,设置NSZombieEnabled后,当你向一个已经释放的对象发送消息,这个对象就不会向之前那样Crash
// 僵尸对象 const char *className = class_getName(receiverClass); const char *zombiePrefix = "_NSZombie
开启僵尸对象(Enable NSZombie Objects) Xcode可以把那些已经release掉得对象,变成“僵尸”,当我们访问一个Zombie对象时,Xcode可以告诉我们正在访问的对象是一个不应该存在的对象了
《Technical Note TN2239, iOS Debugging Magic》 中描述了许多工具和技术,尤其是使用NSZombie(僵尸对象)来帮助查找过度释放的对象。
Diagnostics -> Enable Zombie Objects (勾选) runtime发现如果开启该模式,则NSObject的dealloc方法会被“调配”(swizzle),从而执行将对象的类改为指向_NSZombie_OriginalClass..._NSZombie_类并未实现任何方法,没有超类,跟NSObject一样是个“根类”,该类只有一个实例变量isa,所有OC的根类都必须有此变量。
领取专属 10元无门槛券
手把手带您无忧上云