ios - 很多关于 NSString 引用计数的问题

标签 ios objective-c nsstring

我有一些关于 Objective-C 中的 Mannul 引用计数的测试。 我在下面运行这些代码:

- (void) test {
    NSData *a1 = [[NSData alloc] init];
    NSLog(@"NSData: %lu", [a1 retainCount]);

    NSMutableData *a2 = [[NSMutableData alloc] init];
    NSLog(@"NSMutableData: %lu", [a2 retainCount]);

    NSObject *a3 = [[NSObject alloc] init];
    NSLog(@"NSObject: %lu", [a3 retainCount]);

    NSString *b1 = [[NSString alloc] initWithFormat: @"%@", @"ok"];
    NSLog(@"NSString: %lu", [b1 retainCount]);


    NSString *b2 = [[NSString alloc] initWithFormat: @"%@", a3];
    NSLog(@"NSStinrg: %lu", [b2 retainCount]);


    NSString *a = @"abc";
    NSString *b = @"abc";
    NSLog(@"%p", a);
    NSLog(@"%p", b);

}

控制台:

2016-06-23 16:15:50.490 text[38147:3406036] NSData: 18446744073709551615
2016-06-23 16:15:50.491 text[38147:3406036] NSMutableData: 1
2016-06-23 16:15:50.491 text[38147:3406036] NSObject: 1
2016-06-23 16:15:50.491 text[38147:3406036] NSString: 18446744073709551615
2016-06-23 16:15:50.491 text[38147:3406036] NSStinrg: 1
2016-06-23 16:15:50.491 text[38147:3406036] 0x10359d160
2016-06-23 16:15:50.491 text[38147:3406036] 0x10359d160

我想知道为什么 NSDataNSString 的引用计数是 UINT_MAX(-1),而 initWithFormat 会让 b2 添加一个计数?为什么ab的地址相同?

非常感谢。

最佳答案

空的不可变 NSData 对单个实例是唯一的,不能保留或释放(由 UINT_MAX-1 refcount 指示)。对于NSString,%@被对象调用-description的结果代替,NSString的-description方法返回self。所以你在那里得到一个常量 NSString 文字,这同样不是可以保留或释放的东西。常量字符串也是唯一的,因此在编译时只有一个嵌入到您的二进制文件中,并且不进行任何分配。

关于ios - 很多关于 NSString 引用计数的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37985945/

相关文章:

iOS AFNetworking 阻塞主线程

ios - NSString 比较不适用于 iPAD

objective-c - 使用连接的 NSString 执行选择器以查找 UIImageView

ios - 如何检查应用程序是否出现在 UIViewController 中?

iphone - 解析 XML 和构建 Core Data 数据库的最有效过程是什么?

ios - 如果属性值匹配,UIView aniamteWithDuration 是否退出

ios - UISearchController 的 UISearchBar 在事件时移出屏幕

objective-c - 如何在 iPhone 应用程序中进行图像识别

ios - 如何调整操作表的大小? objective-c

iphone - 如何将 NSArray 转换为 NSString