string 分配在常量区的时候retainCount=2的32次方-1(不在遵循引用规则)
NSString *str1 = @"haha";
[str1 retain];
NSString *str2 = [[NSString alloc] initWithString:@"haha"];
NSString *str3 = [[NSString alloc]initWithFormat:@"haha"];
NSString *str4 = [NSString stringWithFormat:@"haha"];
NSString *str5 = [[NSString alloc]initWithFormat:@"0123456789"];
NSString *str55 = [[NSString alloc]initWithFormat:@"0123456789"];
NSString *str6 = [[NSString alloc]initWithFormat:@"哈哈"];
NSLog(@"%u---%p",(unsigned)str1.retainCount,str1);
NSLog(@"%u---%p",(unsigned)[str2 retainCount],str2);
NSLog(@"%u---%p",(unsigned)[str3 retainCount],str3);
NSLog(@"%u---%p",(unsigned)[str4 retainCount],str4);
NSLog(@"%u---%p",(unsigned)[str5 retainCount],str5);
NSLog(@"%u---%p",(unsigned)[str55 retainCount],str55);
NSLog(@"%u---%p",(unsigned)[str6 retainCount],str6);
输出结果:
2018-09-12 16:52:15.868921+0800 ARCTest[9302:364513] 4294967295---0x10d05c050
2018-09-12 16:52:15.869111+0800 ARCTest[9302:364513] 4294967295---0x10d05c050
2018-09-12 16:52:15.869219+0800 ARCTest[9302:364513] 4294967295---0xa000000616861684
2018-09-12 16:52:15.869326+0800 ARCTest[9302:364513] 4294967295---0xa000000616861684
2018-09-12 16:52:15.869449+0800 ARCTest[9302:364513] 1---0x604000037a00
2018-09-12 16:52:15.869667+0800 ARCTest[9302:364513] 1---0x60400023f540
2018-09-12 16:52:15.869770+0800 ARCTest[9302:364513] 1---0x60400023ed00
用String声明的字符串,初始化是在常量区,不再遵循引用计数规则,只要值一样,占用的地址空间是一样的,所以str1 和str2的地址是一样。
str3和str4 的地址也是一样的 是因为当NSString(汉字和特殊字符除外)字符串的长度小于10位的时候也是分布在常量区的.(默认会将一些长度小于10的字符串直接保存在指针上面,下次创建相同值的时候直接用同一份拷贝,好处是减少了一次指针到值的访问,又减少了一份内存的占用)。
str5 和 str55 当初始化的字符串的长度大于等于10位的时候是分配在堆上的,地址也就不一样 而且引用计数也会正常.
str6 当字符串初格式化是汉字或者特殊字符 在堆区开辟空间,有引用计数。
网友评论