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 ,它有一个retainCountUINT_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。