NSString和block的属性时copy,而不用retain 而容器类使用retain

NSString 为什么要使用copy,而不是retain

  • 1、首先如果使用retain,只是引用计数+1,并没有生成新的对象,所以效率好

  • 2、但是使用copy安全。因为NSString为NSMutableString 的基类,如果将NSMutableString 以retain的形式赋值给NSString后,后续修改NSMutableString会导致NSString内容的变化,这通常不是我们希望的,所以NSString要使用copy。

block为什么使用copy来修饰?

  在MRC下,任何block,都是存在于栈中,这也意味着,其生命周期由系统管理,不需要我们手动管理.这就存在一个问题,那就是我们如果使用block保存一段代码块,欢乐的等待被回调的时候,说不定在之前就已经被系统回收了!

但是ARC下, 使用Strong, Copy修饰Block都是可行的, 都是使Block存在在堆区, 官方建议还是使用copy, 但是使用retain就不一样了, 使用retain修饰Block相当于使用assign; (如果使用retain的话,只会将其计数器加一, 多做一次强引用,但不会重新分配新的内存).

block中使用的

15             NSLog(@"%@",_name);
16             NSLog(@"%@",self->_name);

17             NSLog(@"%@",self.name);

都会引发循环引用,其中15与16行,是等同的;
因为,block存在于堆中,在其代码块中引用的对象都会产生一个強指针.而这时候问题就产生了,因为block本身就被其引用的对象(copy)强指针指向着.这样就造成了双方都无法释放,从而造成了内存泄漏.

self.block (copy) 强引用
block{….self….} 强引用
双方都被对方强引用着, 无法释放
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值