写高质量OC代码52建议总结:36.不要使用retainCount

来源:互联网 发布:mysql自带可视化界面 编辑:程序博客网 时间:2024/05/11 08:42
OC通过引用计数来管理内存。其值表明还有多少个对象希望此对象继续存活。对象创建后,其保留计数大于0.保留与释放操作会使该计数递增和递减,当引用计数变为0时,系统回收对象。
 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
原创粉丝点击