为了账号安全,请及时绑定邮箱和手机立即绑定

NSString保留计数

NSString保留计数

largeQ 2019-12-06 09:43:35
仅仅几天,我正在从事一个项目,所以我必须看看什么是字符串保留数。但是它总是返回我“ 2147483647”,为什么会这样呢?签出此代码以自己检查。NSString *str = [[NSString alloc] initWithString:@"Hello World"];NSLog(@"String Retain Count: %i", [str retainCount]); 所以我的问题是为什么它不像其他对象一样返回1,为什么我得到“ 2147483647”提前致谢。
查看完整描述

3 回答

?
SMILET

TA贡献1796条经验 获得超4个赞

编译器比您更聪明。

它看到@"Hello world"并想到“啊!一个不变的弦!”

然后[[NSString alloc] initWithString:@"Hello world!"],它会想到“ Aha!一个用常量字符串创建的不可变对象!”。

然后,将它们都折叠为一个NSConstantString具有retainCountUINT_MAX,从而永远无法释放它。


查看完整回答
反对 回复 2019-12-06
?
慕码人2483693

TA贡献1860条经验 获得超9个赞

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。


查看完整回答
反对 回复 2019-12-06
?
有只小跳蛙

TA贡献1824条经验 获得超8个赞

为了节省一些可变开销等,在编译时将字符串优化为静态分配的NSString实例。您会看到如此高的保留计数,因为静态字符串在您正在开发的任何平台上都具有最大整数的保留计数。


查看完整回答
反对 回复 2019-12-06
  • 3 回答
  • 0 关注
  • 568 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信