1.首写给出ARC下打印引用计数的方法
NSLog("retain count = %lu\n",CFGetRetainCount((__bridge CFTypeRef)(str))); // 打印无符号长整型
NSLog("retain count = %ld\n",CFGetRetainCount((__bridge CFTypeRef)(str))); // 打印有符号长整型
- 实际求证
NSString
在不同的初始化情况下,引用计数的变化
NSString *str3 = @"1234567890";
NSString *str4 = [[NSString alloc] initWithString:@"1234567890"]; //-1 常量区
NSString *str5 = [[NSString alloc] initWithString:@"12345678902"]; //-1
NSString *str6 = [NSString stringWithString:@"1234567890"]; //-1
NSString *str7 = [NSString stringWithString:@"12345678902"]; //-1
NSString *str8 = [NSString stringWithString:@"ew23re34rf4w3"]; //-1
NSString *str9 = [NSString stringWithFormat:@"%@",@"1234567890"]; // 2 堆区
NSString *str10 = [[NSString alloc] initWithFormat:@"%@",@"1234567890"]; // 1
NSString *str11 = [[NSString alloc] initWithFormat:@"%@",@"1234567890"]; // 1
NSString *str12 = [[NSString alloc] init]; // -1
NSString *str13 = @"3"; // -1
NSString *str14 = [NSString stringWithFormat:@"%@",@"127890"]; // -1
NSString *str15 = [[NSString alloc] initWithFormat:@"%@",@"126790"]; // -1
-
查看论证结果并分析
结论
- 对于
NSString
的对象,不同的创建方式以及不同的字符个数都会影响对象的引用计数;- 首先,当字符串的个数小于
10
个的时候,不管采用哪一种创建方式所得到的字符串都不存在引用计数一说,实际上是无符号整型的最大值,用有符号值打印为-1
,他在在内存中的位置为常量区;- 如果字符串值相同,对于通过
initWithString
和stringWithString
方法创建的NSString
对象,内存地址一样;通过initWithFormat
和stringWithFormat
方法创建的NSString
对象,内存地址不一样;- 当字符串的个数大于
10
个的时候,
- 通过
initWithString
和stringWithString
方法创建的NSString
对象,引用计数为-1
; - 通过
initWithFormat
方法创建的NSString
对象,引用计数为1
; - 通过
stringWithFormat
方法创建的NSString
对象,引用计数为2
;
未完待续 ...