retian详解

- (void)setBook:(Book *)book {
    if (_book != book) {  //如果有StudentOne和StudentTwo里面都有属性book,他需要计数器加1,为什么要有_book!=book,新的Stu对象_book属性为nil,所以不可能等于后面的book,每个Student引用一次,计数器都要加1,N个student引用,计数器的值就是N

        // 先释放旧的成员变量,旧的对象一般是nil,重点,记住释放的是_book成员变量,而不是book,book都是+1
        [_book release];
        // 再retain新传进来的对象
        _book = [book retain];//赋相同的值给计数器加1,完全没有必要,retain存在的原因,就是利用计数器节约内存空间,不像copy那样,在不同的地址上创建一样的对象,如,main 里面有StuOne和StudentTwo,他们使用的是用一个book对象,你要做的只是让它的计数器加1即可,释放其中一个StuOne而不影响StuTwo;
    }
}
retian是在一个地址上使对象的计数器加1,copy是在不同的地址上copy一样的对象



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值