您的位置:首页 > 大数据 > 人工智能

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

2015-10-14 09:38 435 查看

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….} 强引用
双方都被对方强引用着, 无法释放
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: