1、单个对象的野指针问题 【问题】当对象在堆区的空间已经释放了,那么还能在使用p么? 例如: - //用Person类实例化一个对象
- Person *p = [Person new];//此时对象的所有者是自己
-
- //证明该对象有一个所有者
- NSInteger count = [p retainCount];
- NSLog(@"count1 = %lu",count);
-
- [p eat];
- //此时该对象的堆区内存空间已经释放,称为【僵尸对象】
- [p release];
- //验证当对象在堆区的空间已经释放了,那么还能在使用p么?
- //这种情况默认不会报错,如果要检测,需要开启僵尸对象检测
- [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是一个对象】 - //给nil发任何消息都不会有效果,也不会报错
- [nil eat];
- //用nil给对象赋值
- p = nil;
- //此时相当于给nil发送消息
- [p eat];
复制代码【Nil】:A null pointer to an Objective-C class 【NULL】:A nullporinter to anything else。NULL是一个通用指针(泛型指针)
【NSNull null】是一个对象,用在不能使用nil的场合。例如,数组元素中放nil会出问题
2)【不能使用retain让僵尸对象复活】
|