OC----野指针与僵尸对象

野指针与僵尸对象

4.1 野指针
    C语言中的野指针: 定义1个指针变量.没有初始化.这个指针变量的值是1个垃圾值,指向1块随机的空间.这个指针就叫做野指针.
    OC中  的野指针: 指针指向的对象已经被回收了.这样的指针就叫做野指针.
 
4.2 对象回收的本质.
    a) 申请1个变量,实际上就是向系统申请指定字节数的空间.这些空间系统就不会再分配给别人了.
    b) 当变量被回收的时候,代表变量占用的字节空间从此以后系统可以分配给别人使用了.
    c) 但是字节空间中存储的数据还在.
 
4.3 回收对象: 指的是对象占用的空间可以分配给别人.
    当这个对象占用的空间没有分配给别人之前 其实对象数据还在.
 
4.4 僵尸对象
    1个已经被释放的对象,但是这个对象所占的空间还没有分配给别人.这样的对象叫做僵尸对象.
    我们通过野指针去访问僵尸对象的时候.有可能没问题 也有可能有问题.
    当僵尸对象占用的空间还没有分配给别人的时候.这是可以的.
 
4.5 我们认为只要对象称为了僵尸对象,无论如何 都不允许访问了.
    就希望如果访问的是僵尸对象,无论如何报错.
    僵尸对象的实时检查机制.可以将这个机制打开. 打开之后. 只要访问的是僵尸对象,无论空间是否分配 就会报错.
       机制打开:选择运行项 -> Edit Scheme -> Diagnostics -> 选中:Enable Zombie Object  :不建议打开
 
4.6 为什么不默认打开僵尸对象检测.
    一旦打开僵尸对象检测 那么在每访问1个对象的时候 都会先检查这个对象是否为1个僵尸对象,这样是极其消耗性能的.
 
4.7 使用野指针访问僵尸对象会报错. 如何避免僵尸对象错误..
    当1个指针称为野指针以后.将这个指针的值设置nil
    当1个指针的值为nil 通过这个指针去调用对象的方法(包括使用点语法)的时候.不会报错. 只是没有任何反应.
    但是如果通过直接访问属性 -> 就会报错.
 
4.8 无法复活1个僵尸对象.
 
 
//回收对象, 注:其它空间没有分配给别人之前 其实对象数据还在
Person *p1 = [Person new];  //记数:1
p1.name = @"Jack2";     ==  //[p1 setName:@"Jack1"];
[p1 release];               //记数:0
[p1 say];                   //有时有问题,有时没有问题,当空间分配给别人了 或 打开僵尸对象,就会出错
 
 
//野指针访问僵尸对象会报错
Person *p1 = [Person new];  //记数:1
[p1 release];               //记数:0
 
p1 = nil;                   //当1个指针的值为nil 通过这个指针去调用对象的方法(包括使用点语法)的时候.不会报错. 只是没有任何反应.
p1.name = @"Tom1";          //. 赋值时.只是没有任何反应
//p1 setName:@"Tom2";       // 这个直接访问属性, 会出错
[p1 say];                   //执行不会报错,只是不会输出,没有任何反映
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值