Objective-C 僵尸对象

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 ,向已经释放的对象发送消息。









  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值