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….} 强引用 双方都被对方强引用着, 无法释放
相关文章推荐
- 今天在我导入一些安卓项目的源码的时候会出现style.xml 和MAIN.xml 等错误, 网上的方法试了各种clean各种fix等方法都是不能解决。最后去国外论坛得到解决
- Kafka错误3_kafka中 FailedToSendMessageException解决_集群启动问题
- Monitor vs WaitHandle
- AIDL通信原理
- LeetCode -- Contains Duplicate
- iredmail下安装脚本分析(一)---get_all.sh 文件所在目录为PKGS
- Windows下Hadoop报错Failed to locate the winutils
- 【LeetCode从零单刷】Container With Most Water
- adb install 报错INSTALL_FAILED_UPDATE_INCOMPATIBLE 解决方法
- hdu4810Wall Painting dp+异或
- rails项目本地运行
- VIVADO报错解决: logical ports have no user assigned specific location constraint (LOC)
- grails2.3.11第一课
- 音乐播放器-MainFragment分析2
- Codeforces Round #325 (Div. 2)D. Phillip and Trains BFS
- 【停课集训10.13】【#3 training】
- Gmail Api 的解读及例子
- hdu 4770 Lights Against Dudely(二进制枚举情况)
- Failed to install Intel HAXM.
- 彻底解决INSTALL_FAILED_UPDATE_INCOMPATIBLE的安装错误