教育程序员@IT·互联网

内存管理 - 引用计数器

2017-04-15  本文已影响41人  Mr_HeH

一、 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消息

上一篇 下一篇

猜你喜欢

热点阅读