您的位置:首页 > 大数据 > 人工智能

ARC下强引用弱引用retainCount增减规律

2015-09-07 17:17 423 查看
本文只是记录ARC下不同引用时rc变化规律,不涉及基本原理。

NSString *bstr = [NSString stringWithFormat:@"bbb"];
NSLog(@"bstr-->%ld", CFGetRetainCount((__bridge CFTypeRef)bstr));
NSString *str = bstr;
NSLog(@"str-->%ld", CFGetRetainCount((__bridge CFTypeRef)str));
NSLog(@"bstr-->%ld", CFGetRetainCount((__bridge CFTypeRef)bstr));
printf("\n");

__weak NSString *sstr = bstr;
NSLog(@"sstr-->%ld", CFGetRetainCount((__bridge CFTypeRef)sstr));
NSLog(@"bstr-->%ld", CFGetRetainCount((__bridge CFTypeRef)bstr));
NSLog(@"str-->%ld", CFGetRetainCount((__bridge CFTypeRef)str));
bstr-->2
str-->3
bstr-->3

sstr-->4
bstr-->3
str-->3


第二组,将bstr声明为__weak类型:

__weak NSString *bstr = [NSString stringWithFormat:@"bbb"];
NSLog(@"bstr-->%ld", CFGetRetainCount((__bridge CFTypeRef)bstr));
NSString *str = bstr;
NSLog(@"str-->%ld", CFGetRetainCount((__bridge CFTypeRef)str));
NSLog(@"bstr-->%ld", CFGetRetainCount((__bridge CFTypeRef)bstr));
printf("\n");

__weak NSString *sstr = bstr;
NSLog(@"sstr-->%ld", CFGetRetainCount((__bridge CFTypeRef)sstr));
NSLog(@"bstr-->%ld", CFGetRetainCount((__bridge CFTypeRef)bstr));
NSLog(@"str-->%ld", CFGetRetainCount((__bridge CFTypeRef)str));
bstr-->2
str-->2
bstr-->3

sstr-->3
bstr-->3
str-->2


对比以上结果,可以得出规律,__strong = __strong则都+1,__weak = __strong则weak+1而strong不变,__strong = __weak仍然weak+1而strong不变,__weak = __weak则都不变(等号表示赋值)。
另外,当@"bbb"以类方法产出时,bstr无论是强还是弱,其rc都是2,因此由以上规律可推测(第3、4条)类方法传出的应该是个weak指针,所以也才因此无关使用者而可以自己负责生命周期吧。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  ARC 内存管理 objc