21

使用以下表示法创建字符串时:

NSString *foo = @"Bar";

需要释放foo吗?还是foo在这种情况下自动释放?

4

3 回答 3

18

编译器分配的字符串(格式为@"STRING")是常量,因此给它们的-retain、-release 和-autorelease 消息将被忽略。在这种情况下,您不必释放或自动释放 foo (但它不会受到伤害)。

于 2008-12-01T03:43:15.530 回答
15

如文档中所述

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

如果您使用名称以“alloc”或“new”开头或包含“copy”(例如,alloc、newObject 或 mutableCopy)的方法创建对象,或者向其发送保留消息,则您将获得对象的所有权。您有责任放弃使用 release 或 autorelease 拥有的对象的所有权。任何其他时间您收到一个对象,您都不能释放它。

由于您没有使用 alloc、copy 等,因此您无需担心释放对象。

于 2008-12-01T04:12:01.153 回答
7

我同意@Ben\ Gottlieb 在“编译器分配的字符串(格式为@“STRING”)是常量”但由于您没有通过传递allocretain消息初始化它们,因此您不能向它们传递releaseautorelease消息,否则您的应用程序将崩溃使用以下日志

“未分配被释放的指针”

笔记

NSString *str = [NSString string];

相当于:

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

所以release或者也autorelease不能在这里通过。

于 2010-12-17T10:46:18.607 回答