仅仅几天我正在研究一个项目,我必须看看什么是一个字符串的保留计数。
但它总是让我回复“2147483647”,为什么会这样?
查看此代码以自行检查。
NSString *str = [[NSString alloc] initWithString:@"Hello World"];
NSLog(@"String Retain Count: %i", [str retainCount]);
所以我的问题是为什么它没有返回1像其他对象返回,为什么我得到“2147483647”
提前致谢。
答案 0 :(得分:26)
编译器比你聪明。
它看到@"Hello world"
并认为“啊哈!一个恒定的字符串!”
然后看到[[NSString alloc] initWithString:@"Hello world!"]
并认为“啊哈!用常量字符串创建的不可变对象!”
然后将它们折叠成一个NSConstantString
,其retainCount
UINT_MAX
,以便它永远不会被释放。
答案 1 :(得分:3)
NSString *str = [[NSString alloc] initXXX
通常会分配一些RAM并返回一个指针。然后该RAM将受到释放和重新定位。但是,当你这样做时:
NSString *str = [[NSString alloc] initWithString:@"Hello World"];
返回的字符串是@“Hello World”,它已经被分配,因为它是一个字符串文字。由于它是字符串文字,因此无法释放它,因此系统必须将其标记为不可释放。它的方式是将其保留计数设置为最大整数值。
NString *str = [[NSString alloc] initWithFormat:@"Hello World. Today is @%", todayDate];
此字符串的retainCount为1.虽然其中有一个字符串常量,但它会被另一个字符串追加。由于您无法修改该常量字符串,因此会生成“Hello World。”字符串的副本,并将todayDate字符串的内容添加到该字符串中。现在该内存被赋予调用者的所有权,retainCount为1。
答案 2 :(得分:2)
字符串在编译时被优化为静态分配的NSString实例,以便节省一些变量开销等。你看到这么高的保留计数,因为静态字符串在你正在开发的任何平台上都有一个最大整数的保留计数。