2008-12-01 50 views
19

当使用下面的符号创建一个字符串:是一个字面的NSString autoreleased还是需要发布?

NSString *foo = @"Bar"; 

难道一个需要释放foo?或者是foo autoreleased在这种情况下?

+0

对不起,我要补充的回答为时已晚,但我认为你应该检查它的完整性是Ben的回答中有一些错误。 – 2010-12-17 10:48:40

回答

17

编译器分配(格式@“STRING”)是恒定的,所以-retain,-release字符串,并将其-autorelease消息被忽略。在这种情况下,你不必释放或autorelease foo(但它不会受到伤害)。

+0

我觉得释放FOO导致我的程序崩溃与“指针被释放没有被分配” – bobobobo 2009-11-02 08:03:41

+0

@bobobobo我完全赞成你。 – 2010-12-17 10:46:56

15

如文档

http://developer.apple.com/documentation/Cocoa/Conceptual/MemoryMgmt/Tasks/MemoryManagementRules.html

你把一个对象的所有权,如果你 使用其名称 开始“黄金”或“新”或 含有“的方法创建它提到复制”(例如,分配, NEWOBJECT,或mutableCopy),或者如果你 向它发送一个retain消息。你是 负责放弃你自己的使用 释放或自动释放对象的 所有权。任何其他时间 您收到一个对象,你不能 释放。

因为你没有使用alloc,copy等,所以你不需要担心释放对象。

6

我@Ben \戈特利布同意在“编译器分配(格式@字符串” STRING“)是常数”,但你有没有通过传递一个allocretain消息初始化它们,你不得通过releaseautorelease消息给他们,否则你的应用程序将与以下日志崩溃

“指针被释放没有 分配”

NOTE

NSString *str = [NSString string]; 

等同于:

NSString *str = [[[NSString alloc] init] autorelease]; 

所以releaseautorelease不能在这里也过去了。

相关问题