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();
}