我有一些关于 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
我想知道为什么 NSData
和 NSString
的引用计数是 UINT_MAX
(-1),而 initWithFormat
会让 b2
添加一个计数?为什么a
和b
的地址相同?
非常感谢。
最佳答案
空的不可变 NSData 对单个实例是唯一的,不能保留或释放(由 UINT_MAX-1 refcount 指示)。对于NSString,%@被对象调用-description的结果代替,NSString的-description方法返回self。所以你在那里得到一个常量 NSString 文字,这同样不是可以保留或释放的东西。常量字符串也是唯一的,因此在编译时只有一个嵌入到您的二进制文件中,并且不进行任何分配。
关于ios - 很多关于 NSString 引用计数的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37985945/