我想知道是否
return @"Text";
是自动释放的吗?如果是这样,请你解释一下。
编译器是否为我们创建了一个NSString
对象,或者编译器将如何处理这个?
答案 0 :(得分:5)
不,不是。
@"Text"
是一个常量字符串,这意味着每次该行运行时都会返回相同的对象,并且它永远不会被释放。
- (void)release
是一种无操作方法。如果你看一下课程,你会发现它不是正常的NSString。
答案 1 :(得分:3)
将常量NSStrings编译到应用程序二进制文件中。释放它们是没有意义的,因为它们使用的内存是只读的,不是来自堆而且不能被回收。如果你查看一个常量NSString的保留计数,你会看到它设置为一些天文数字高(我认为是2 ^ 31-1)。惯例是发送给具有此保留计数的对象的-release
不执行任何操作,-retain
也不执行任何操作。因此,除了将字符串添加到自动释放池之外,发送-autorelease
也不会做任何事情(实际上,即使可能已经优化了)。
就所有权而言(这是应该考虑这个问题的方式),对待常量NSStrings与其他任何东西完全一样。您没有使用new,alloc或copy获取它,因此除非您保留它,否则您不拥有它。因此,在返回之前,您也不需要在示例中自动释放它。
调用者应保留返回值,如果它想保留它,即使-retain
确实无效。这使得您的代码更加通用,因此如果(例如)您的方法被更改为返回非常量NSString,则您不必担心更改所有调用者。
答案 2 :(得分:0)
是。
您未分配,保留或复制的任何内容都应视为自动释放。