ios NSString引用计数的那些事

1.首写给出ARC下打印引用计数的方法

    NSLog("retain count = %lu\n",CFGetRetainCount((__bridge CFTypeRef)(str))); // 打印无符号长整型
    NSLog("retain count = %ld\n",CFGetRetainCount((__bridge CFTypeRef)(str))); // 打印有符号长整型
  1. 实际求证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
  1. 查看论证结果并分析


    WechatIMG11.jpeg
  2. 结论

  1. 对于NSString的对象,不同的创建方式以及不同的字符个数都会影响对象的引用计数;
  2. 首先,当字符串的个数小于10个的时候,不管采用哪一种创建方式所得到的字符串都不存在引用计数一说,实际上是无符号整型的最大值,用有符号值打印为-1,他在在内存中的位置为常量区;
  3. 如果字符串值相同,对于通过initWithStringstringWithString方法创建的NSString对象,内存地址一样;通过initWithFormatstringWithFormat方法创建的NSString对象,内存地址不一样;
  4. 当字符串的个数大于10个的时候,
  • 通过initWithStringstringWithString方法创建的NSString对象,引用计数为-1
  • 通过initWithFormat方法创建的NSString对象,引用计数为1
  • 通过stringWithFormat 方法创建的NSString对象,引用计数为2

未完待续 ...

你可能感兴趣的:(ios NSString引用计数的那些事)