NSString 的引用计数

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 当字符串初格式化是汉字或者特殊字符 在堆区开辟空间,有引用计数。

你可能感兴趣的:(NSString 的引用计数)