NSString保留计数

仅仅几天,我正在从事一个项目,所以我必须看看什么是字符串保留数。


但是它总是返回我“ 2147483647”,为什么会这样呢?


签出此代码以自己检查。


NSString *str = [[NSString alloc] initWithString:@"Hello World"];

NSLog(@"String Retain Count: %i", [str retainCount]); 

所以我的问题是为什么它不像其他对象一样返回1,为什么我得到“ 2147483647”


提前致谢。


largeQ
浏览 569回答 3
3回答

SMILET

编译器比您更聪明。它看到@"Hello world"并想到“啊!一个不变的弦!”然后[[NSString alloc] initWithString:@"Hello world!"],它会想到“ Aha!一个用常量字符串创建的不可变对象!”。然后,将它们都折叠为一个NSConstantString具有retainCount的UINT_MAX,从而永远无法释放它。

慕码人2483693

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];该字符串的keepCount为1。尽管其中有一个字符串常量,但该常量将附加到另一个字符串之后。由于您不能修改该常量字符串,因此将复制“ Hello World。”字符串,并将nowDate字符串的内容添加到其中。现在,该内存已授予调用者所有权,retainCount为1。

有只小跳蛙

为了节省一些可变开销等,在编译时将字符串优化为静态分配的NSString实例。您会看到如此高的保留计数,因为静态字符串在您正在开发的任何平台上都具有最大整数的保留计数。
打开App,查看更多内容
随时随地看视频慕课网APP