最近我在做一个项目,需要查看字符串的保留计数。
但是它总是返回"2147483647",为什么会这样呢?
请查看以下代码以自行检查。
NSString *str = [[NSString alloc] initWithString:@"Hello World"];
NSLog(@"String Retain Count: %i", [str retainCount]);
所以我的问题是,为什么它没有像其他对象返回1那样,为什么我得到的是“2147483647”?
提前感谢。
最近我在做一个项目,需要查看字符串的保留计数。
但是它总是返回"2147483647",为什么会这样呢?
请查看以下代码以自行检查。
NSString *str = [[NSString alloc] initWithString:@"Hello World"];
NSLog(@"String Retain Count: %i", [str retainCount]);
编译器比你聪明。
它看到@"Hello world"
就会想:“啊哈!一个常量字符串!”
然后它看到[[NSString alloc] initWithString:@"Hello world!"]
就会想:“啊哈!使用常量字符串创建了一个不可变对象!”
然后它将这两个内容折叠成一个单一的NSConstantString
,它的retainCount
为UINT_MAX
,因此永远无法释放。
NSString *str = [[NSString alloc] initXXX
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。
该字符串在编译时被优化为静态分配的NSString实例,以节省一些变量开销等。您看到如此高的保留计数是因为静态字符串在您所开发的任何平台上都具有最大整数的保留计数。