• iOS僵尸对象之研究


    Zombie Objects对象研究

    一、Xcode 关闭ARC

    project -> Build settings  搜索 Automatic Reference Counting      设置为NO

    二、开启 僵尸对象 选项 

    三、代码验证

    - (void)viewDidLoad {
        [super viewDidLoad];
        // Do any additional setup after loading the view, typically from a nib.
        
        Person *person =[[Person alloc]init];
        NSLog(@"person:%@----%@",[self className:person],NSStringFromSelector(_cmd));
        person.name=@"红叶";
        
        [person release];
        NSLog(@"person:%@",[self className:person]);
        person.name=@"绿叶";
    }
    - (NSString*)className:(id)obj{
    
        const char * name=object_getClassName(obj);
        return [NSString stringWithUTF8String:name];
    }

    a.关闭ARC,关闭僵尸对象选项时

     [person release];执行后,person对象会自动执行dealloc方法。因为Scheme中关闭了僵尸对象选项,所以person对象释放后并不会生成僵尸对象

    当再次调用person对象时,报错类型为:错误内存地址访问异常

    打印结果:

    2016-12-27 15:37:56.769 ZomObj[5515:213898] person:Person----viewDidLoad

    b.关闭ARC,开启僵尸对象选项时

    在[person release];之前

    person对象为Person类,正常使用

    在[person release];之后

    person对象被释放了,由于scheme开启了僵尸对象选项,所以person对象在释放时调用的dealloc方法在底层被swizzle了

    dealloc方法执行时,代码走的并不是清理资源,回收内存。而是copy了一个NSZombie对象模版,并修改zimbie对象的isa指针,形成了一个新的僵尸对象类_NSZombie_Person。所以在[person release];执行之后, 打印的person对象类型为_NSZombie_Person

    _NSZombie_Person类中只有一个isa指针,里面没有其他的属性和方法,所以不能响应任何事件,所以在向这个僵尸对象发送消息时,就会报错,并打印出来。这非常有利于调试。

     打印结果:

    2016-12-27 15:48:20.006 ZomObj[5624:218915] person:Person----viewDidLoad
    
    2016-12-27 15:48:20.006 ZomObj[5624:218915] person:_NSZombie_Person
    
    2016-12-27 15:48:20.007 ZomObj[5624:218915] *** -[Person setName:]: message sent to deallocated instance 0x6000000161d0
    
    Message from debugger: Terminated due to signal 9
  • 相关阅读:
    [Dynamic Language] Python Django: 模板引擎(3)模板标签和过滤器
    [Linux] Ubuntu: 登陆界面无法输入密码
    [Dynamic Language] Python Exec & Compile
    [Dynamic Language] Python: 类基本结构和继承
    [Linux] VIM 代码折叠
    [Database] MongoDB (2) 高级查询条件操作符
    [Dynamic Language] Python: unindent does not match any outer indentation level
    [Linux] VMware 配置linux后出现提示:Failed to initialize remote display subsystem
    [Database] Redis (2) redispy API Reference
    [Database] MongoDB (1) 基本连接、操作、查询
  • 原文地址:https://www.cnblogs.com/zhou--fei/p/6226295.html
Copyright © 2020-2023  润新知