Xcode8 中的retainCount

序言:

苹果现在是及其不推荐使用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里面有早就创建了这个对象了),于是我们拿到了一个非常出人意料的结果。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值