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