1、开始僵尸对象模式
在Xcode中开启僵尸对象模式步骤
2、什么是僵尸对象
在正常情况下,向已经回收的对象发送消息时灵时不灵,这要取决于该对象所在的内存空间是否被覆盖。cocoa提供了僵尸对象(Zombie Object)的功能,开启该功能后,运行时会把已经释放的对象转化为特殊的僵尸对象,而不是真正的回收它们,这种对象在核心内存无法重用,也不可能被复写。当僵尸对象收到消息后悔抛出异常,并描述回收之前的对象。僵尸对象时调试内存管理问题的常用方式。
创建Person类
Person.h文件
@interface Person : NSObject
@property (nonatomic, assign) int age;
@end
Person.m文件
#import "Person.h"
@implementation Person
- (void)dealloc
{
NSLog(@"----dealloc----");
[super dealloc];
}
@end
main.m文件
#import "Person.h"
#import <objc/runtime.h>
int main(int argc, const char * argv[]) {
@autoreleasepool {
// 1
Person *p = [[Person alloc] init];
NSLog(@"----------Befare dealloc------------");
Class cls_b = object_getClass(p);
Class superCls_b = class_getSuperclass(cls_b);
NSLog(@"cls = %s, superCls = %s", class_getName(cls_b), class_getName(superCls_b));
// 0 p对象释放,变为僵尸对象
[p release];
NSLog(@"----------After dealloc------------");
Class cls_a = object_getClass(p);
Class superCls_a = class_getSuperclass(cls_a);
NSLog(@"cls = %s, superCls = %s", class_getName(cls_a), class_getName(superCls_a));
p.age = 20;
}
return 0;
}
运行打印结果:
2015-07-11 21:21:31.710 僵尸对象[1380:100198] ----------Befare dealloc------------
2015-07-11 21:21:31.712 僵尸对象[1380:100198] cls = Person, superCls = NSObject
2015-07-11 21:21:31.712 僵尸对象[1380:100198] ----dealloc----
2015-07-11 21:21:31.712 僵尸对象[1380:100198] ----------After dealloc------------
2015-07-11 21:21:31.712 僵尸对象[1380:100198] cls = _NSZombie_Person, superCls = nil
2015-07-11 21:21:31.712 僵尸对象[1380:100198] *** -[Person setAge:]: message sent to deallocated instance 0x100104c00
** p对象释放之前,p对象的isa指针指向Person类型的对象, p对象释放之后p对象的isa指针指向_NSZombie_Person类型的对象,说明该对象已被释放,成为将是对象。
** 给僵尸对象发送消息会发抛出异常,-[Person setAge:]: message sent to deallocated instance 0x100104c00 ,向已经释放的对象发送消息。