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