是返回@“文字”;自动释放?

时间:2010-10-27 10:17:12

标签: iphone objective-c memory-management

我想知道是否

return @"Text";

是自动释放的吗?如果是这样,请你解释一下。

编译器是否为我们创建了一个NSString对象,或者编译器将如何处理这个?

3 个答案:

答案 0 :(得分:5)

不,不是。

@"Text"是一个常量字符串,这意味着每次该行运行时都会返回相同的对象,并且它永远不会被释放。

- (void)release是一种无操作方法。如果你看一下课程,你会发现它不是正常的NSString。

答案 1 :(得分:3)

将常量NSStrings编译到应用程序二进制文件中。释放它们是没有意义的,因为它们使用的内存是只读的,不是来自堆而且不能被回收。如果你查看一个常量NSString的保留计数,你会看到它设置为一些天文数字高(我认为是2 ^ 31-1)。惯例是发送给具有此保留计数的对象的-release不执行任何操作,-retain也不执行任何操作。因此,除了将字符串添加到自动释放池之外,发送-autorelease也不会做任何事情(实际上,即使可能已经优化了)。

就所有权而言(这是应该考虑这个问题的方式),对待常量NSStrings与其他任何东西完全一样。您没有使用new,alloc或copy获取它,因此除非您保留它,否则您不拥有它。因此,在返回之前,您也不需要在示例中自动释放它。

调用者应保留返回值,如果它想保留它,即使-retain确实无效。这使得您的代码更加通用,因此如果(例如)您的方法被更改为返回非常量NSString,则您不必担心更改所有调用者。

答案 2 :(得分:0)

是。

您未分配,保留或复制的任何内容都应视为自动释放。