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

关于retainCount在不同场合输出值不符合预期的分析

2018-02-08 15:52 344 查看

1、NSString、NSMutableString 和 NSArray、NSMutableArray

void x(void)
{
NSString *str = [[NSString alloc]init]; //定义初始一个对象
//NSArray *str = [[NSArray alloc]init]; //这句的下面的结果也是一样的

NSLog(@"str的引用计数 %lu",str.retainCount);
//str的引用计数 18446744073709551615 (64位最大正整数)
//即为有符号的-1
//疑问 1:为什么不是1呢

void (^block)(void) = ^(void)
{
NSLog(@"str的引用计数 %lu",str.retainCount);
//str的引用计数 18446744073709551615 (64位最大正整数)
//即为有符号的-1
//疑问 1:为什么不是1呢
};

NSLog(@"str的引用计数 %lu",str.retainCount);
//str的引用计数 18446744073709551615 (64位最大正整数)
//即为有符号的-1
//疑问 1:为什么不是1呢

block();

}


void x(void)
{
NSMutableString *str = [[NSMutableString alloc]init]; //定义初始一个对象
//NSMutableArray *str = [[NSMutableArray alloc]init]; //这句的下面的结果也是一样的

NSLog(@"str的引用计数 %lu",str.retainCount);
//1   疑问 2:又为什么是1了呢?

void (^block)(void) = ^(void)
{
NSLog(@"str的引用计数 %lu",str.retainCount);
//1    疑问 2:又为什么是1了呢?
};

NSLog(@"str的引用计数 %lu",str.retainCount);
//1    疑问 2:又为什么是1了呢?

block();

}


结论:

大概编译器对NSXXXX和NSMutableXXXX做了优化,而让NSXXXX的引用计数为 -1 ,而NSMutableXXXX的引用计数为 1。

对于字符串、数组常量,系统不会收回,也不会对其作引用计数,即使我们对s如何retain或release

没有必要去特地查询一个对象的retain count是多少。查询的结果常常会出乎意料。

2、NSObject

void x(void)
{
NSObject *str = [[NSObject alloc]init];

NSLog(@"str的引用计数 %lu",str.retainCount);
//1

void (^block)(void) = ^(void)
{
NSLog(@"str的引用计数 %lu",str.retainCount);
//1
};

NSLog(@"str的引用计数 %lu",str.retainCount);
//1

block();

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: