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….} 强引用
双方都被对方强引用着, 无法释放