写高质量OC代码52建议总结:36.不要使用retainCount
来源:互联网 发布:mysql自带可视化界面 编辑:程序博客网 时间:2024/05/11 08:42
OC通过引用计数来管理内存。其值表明还有多少个对象希望此对象继续存活。对象创建后,其保留计数大于0.保留与释放操作会使该计数递增和递减,当引用计数变为0时,系统回收对象。
ARC中已经将此方法废弃。
1.它所返回的引用计数只是某个时间点上的值。该方法并没有考虑到稍后系统会把自动释放池清空,因而不会将后续的释放操作计算到数值里。这样,就未必能反映真实的计数了。
2.retainCount可能永远都不返回0,有时系统会优化对象的释放行为,保留计数还是1的时候就回收了。只有系统不打算优化的时候,计数才会递减到0.
总结:
1.对象的保留计数无法反应对象生命周期的全貌。
2.ARC下,retainCount被废除,使用会报错。
ARC中已经将此方法废弃。
1.它所返回的引用计数只是某个时间点上的值。该方法并没有考虑到稍后系统会把自动释放池清空,因而不会将后续的释放操作计算到数值里。这样,就未必能反映真实的计数了。
2.retainCount可能永远都不返回0,有时系统会优化对象的释放行为,保留计数还是1的时候就回收了。只有系统不打算优化的时候,计数才会递减到0.
NSString *string = @"Some string"; NSLog(@"string retainCount = %lu", [string retainCount]); NSNumber *numberI = @1; NSLog(@"numberI retainCount = %lu", [numberI retainCount]); NSNumber *numberF = @3.141f; NSLog(@"numberF retainCount = %lu", [numberF retainCount]); // 打印结果 string retainCount = 18446744073709551615 numberI retainCount = 9223372036854775807 numberF retainCount = 1前两个对象都是单例对象,其保留计数都很大,系统会尽可能把nsstring对象实现成单例对象。本例中的nsstring是个编译器常量,编译器会把NSString表示的数据放到应用程序的二进制文件里,运行程序的时候就可以直接用了。NSNumber也类似,它使用了一种“标签指针”的概念来标注特定类型的数值。这种做法不直接使用NSNmuber,而是把与数值有关的消息全部放到指针值里面,运行期系统会在消息派发期间检测到这种指针,并执行相应的操作。如果根据NSNumber对象的具体保留计数来进行操作,而系统却以标签指针来实现此对象,那么编码就错误了。
总结:
1.对象的保留计数无法反应对象生命周期的全貌。
2.ARC下,retainCount被废除,使用会报错。
阅读全文
0 0
- 写高质量OC代码52建议总结:36.不要使用retainCount
- 写高质量OC代码52建议总结:46.不要使用dispatch_get_current_queue
- 写高质量OC代码52建议总结:40.用块引用其所属对象不要出现保留环
- 编写高质量OC代码52建议总结:26.不要在分类中设置属性
- 写高质量OC代码52建议总结:39.用handler块降低代码分散程度
- 写高质量OC代码52建议总结:43.掌握GCD及操作队列的使用时机
- 写高质量OC代码52建议总结:28.通过协议提供匿名对象
- 写高质量OC代码52建议总结:30.以ARC简化引用计数
- 写高质量OC代码52建议总结:33.以弱引用避免保留环
- 写高质量OC代码52建议总结:35.用僵尸对象调试内存管理问题
- 写高质量OC代码52建议总结:37.理解“块”
- 写高质量OC代码52建议总结:38.为常用的块创建typedef
- 写高质量OC代码52建议总结:41.多用派发列队,少用同步锁
- 写高质量OC代码52建议总结:42.多用GCD,少用performSelector系列方法
- 写高质量OC代码52建议总结:47.熟悉系统架构
- 写高质量OC代码52建议总结:48.多用块枚举,少用for循环
- 写高质量OC代码52建议总结:51.load和initialize
- 写高质量OC代码52建议总结:52.NSTimer会保留其目标对象
- Lintcode77 Longest Common Subsequence solution 题解
- ELK学习9_ELK数据流传输过程_问题总结2
- 寻找最长回文子串(Palindromic Substring)的一种简单的Java解法
- Packet for query is too large (mysql)
- 微信中控网页授权的实现
- 写高质量OC代码52建议总结:36.不要使用retainCount
- Android编译时遇到的问题
- errcode: 41028, errmsg: "invalid form id hint: [60kWOa0285ge25
- <iOS开发>之CocoaAsyncSocket使用
- ECMAScript2018语言规范
- 20170627在东软
- 远程过程调用 (RPC)
- ELK学习10_ELK系列--实时日志分析系统ELK 部署与运行中的问题汇总
- dancing links(舞蹈链)