3 回答
TA贡献1796条经验 获得超4个赞
编译器比您更聪明。
它看到@"Hello world"
并想到“啊!一个不变的弦!”
然后[[NSString alloc] initWithString:@"Hello world!"]
,它会想到“ Aha!一个用常量字符串创建的不可变对象!”。
然后,将它们都折叠为一个NSConstantString
具有retainCount
的UINT_MAX
,从而永远无法释放它。
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。
TA贡献1824条经验 获得超8个赞
为了节省一些可变开销等,在编译时将字符串优化为静态分配的NSString实例。您会看到如此高的保留计数,因为静态字符串在您正在开发的任何平台上都具有最大整数的保留计数。
- 3 回答
- 0 关注
- 568 浏览
添加回答
举报