Xcode8 中的retainCount

来源:互联网 发布:项目管理平台软件 编辑:程序博客网 时间:2024/06/06 03:56

序言:

苹果现在是及其不推荐使用retainCount的,也就是不推荐使用手动管理内存。

不信看下面就能体会到了。


例子1:

新创建一个非ARC环境的BridgeMRC文件。

#import "BridgeMRC.h"@implementation BridgeMRC- (void)forExample{    NSString *aNNstring = [NSString stringWithFormat:@"%@",@"hello world"];    NSLog(@"aNNstring  Retain count is ====== %ld", [aNNstring retainCount]);    CFStringRef aCFString = (CFStringRef)aNNstring;    NSLog(@"CFGetRetainCount  is ~~~ %ld",  CFGetRetainCount(aCFString));    [aNNstring release];}@end

我们用控制台打印下retaiCount,发现命令无效。

p aNNstring.retainCount.png

在以前的Xcode版本,Objective -C Automatic Reference Counting 设置为NO是可以输出结果的。
但是现在即使那么设置,也是不行啊。

既然控制台不可以了,那么我们就在代码中NSLog出来吧。

打印方法1、retainCount

对于Foundation对象,使用retainCount方法获得。

- (NSUInteger)retainCount  OBJC_ARC_UNAVAILABLE;

仔细看方法retainCount 方法,在ARC中是无法使用的。

我们只能把某个文件设置为MRC,然后才能打印。

打印方法2、CFGetRetainCount(<#CFTypeRef cf#>)

对于Core Foundation对象,只能使用 CFGetRetainCount(<#CFTypeRef cf#>)方法。

    NSLog(@"CFGetRetainCount  is ~~~ %ld",  CFGetRetainCount(aCFString));

对于Foundation对象,我们也可以使用此方法.

    NSLog(@"Retain count is %ld", CFGetRetainCount((__bridge CFTypeRef)aNNstring));

例子2:

上面的代码我们稍加修改,仅仅修改下aNNstring的初始化:

#import "BridgeMRC.h"@implementation BridgeMRC- (void)forExample{    NSString *aNNstring = @"hello";    NSLog(@"aNNstring  Retain count is ====== %ld", [aNNstring retainCount]);    CFStringRef aCFString = (CFStringRef)aNNstring;    NSLog(@"CFGetRetainCount  is ~~~ %ld",  CFGetRetainCount(aCFString));    [aNNstring release];}@end

我们看下控制台的打印结果,

结果让我们大跌眼镜!这是搞毛线啊!

查阅了一下官方的文档,第一句就是“Do not use this method.”

后面给出了说明,因为Autorelease pool的存在,对于内存的管理会相当复杂,retainCount就不能用作调试内存时的依据了。这样对于第一段的结果就可以理解了,可能系统对于这一个特殊的对象有特殊的处理(没准framework里面有早就创建了这个对象了),于是我们拿到了一个非常出人意料的结果。