A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

1、单个对象的野指针问题
【问题】当对象在堆区的空间已经释放了,那么还能在使用p么?
例如:
  1.   //用Person类实例化一个对象
  2.         Person *p = [Person new];//此时对象的所有者是自己
  3.         
  4.         //证明该对象有一个所有者
  5.         NSInteger count = [p retainCount];
  6.         NSLog(@"count1 = %lu",count);
  7.             
  8. [p eat];
  9.         //此时该对象的堆区内存空间已经释放,称为【僵尸对象】
  10.         [p release];
  11.         //验证当对象在堆区的空间已经释放了,那么还能在使用p么?
  12.         //这种情况默认不会报错,如果要检测,需要开启僵尸对象检测
  13.         [p eat];//野指针访问
复制代码

打印结果:
2015-10-06 11:16:18.618 ClassOne[1132:303] count1 = 1
2015-10-06 11:16:18.620 ClassOne[1132:303] this personeat food...
2015-10-06 11:16:18.620 ClassOne[1132:303] This persondead....
2015-10-06 11:16:18.621 ClassOne[1132:303] this personeat food...

【开启检测僵尸对象检测】
【注意】
1)【空指针】没有指向任何东西的指针,给空指针发送消息不会报错
【关于nil和Nil和NULL的区别】
【nil】:A nullpointer to an Objective-C object
【nil是一个对象】
  1.         //给nil发任何消息都不会有效果,也不会报错
  2.         [nil eat];
  3.         //用nil给对象赋值
  4.         p = nil;
  5.         //此时相当于给nil发送消息
  6.         [p eat];
复制代码
【Nil】:A null pointer to an Objective-C class
【NULL】:A nullporinter to anything else。NULL是一个通用指针(泛型指针)

【NSNull null】是一个对象,用在不能使用nil的场合。例如,数组元素中放nil会出问题


2)【不能使用retain让僵尸对象复活】

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马