一、 retain、release、retainCount的使用
1. 举(Person)栗子来说吧
//1.alloc之后引用计数为1
Person *p = [[Person alloc]init];
NSLog(@"--%ld",[p retainCount]); // 1
//2.release之后为0.同时调用Person的dealloc方法
[p release];
2. 过度释放(多次使用release)
例:
Person *p = [[Person alloc]init];
//alloc之后引用计数为1
NSLog(@"--%ld",[p retainCount]);
//release之后为0.同时调用Person的dealloc方法
[p release];// 这一步结束会调用dealloc方法
//又release会出现啥情况呢?
[p release];
oh,多写了一个release报错了。从报错原因(EXC_BAD_ACCESS),就知道这是报野指针错误。为啥会出现这个错误呢,来简单分析哈哈。
我们可以知道,在引用计数器为0的时候,对象就会被销毁掉。因此p指针指向的对象已经不能用了,所以报这个错。此时这个p指针也就成了野指针。
那么如何解决野指针错误呢?
就是在引用计时器为0,即Person对象被销毁之后,就让p指针置空。
Person *p = [[Person alloc]init];
//alloc之后引用计数为1
NSLog(@"--%ld",[p retainCount]);
//release之后为0.同时调用Person的dealloc方法
[p release];
//赋值为nil
p = nil;
[p release];//此时这句执行也不会报错了,oc中不存在空指针错误,即给空指针发送消息也不会报错
总结: 给僵尸对象不能发送消息,也不能起死回生,即不能在给僵尸对象发送retain消息
网友评论