Objective c ";“一些文本”;返回自动释放或保留1个对象?

Objective c ";“一些文本”;返回自动释放或保留1个对象?,objective-c,memory-management,autorelease,Objective C,Memory Management,Autorelease,鉴于此代码: // Initialize string NSString *name = @"Franzi"; @“”宏使用给定的文本(此处为名称Franzi)和保留计数1创建NSString 所以@“”给出了一个NSString,其中包含是否必须释放?我对这个物体负责吗? 第二个代码示例让我感到困惑,尽管我是这样使用的: NSSting *message; message = [NSString stringWithFormat:@"Hello @%!",name]; //message =

鉴于此代码:

// Initialize string
NSString *name = @"Franzi";
@“”宏使用给定的文本(此处为名称Franzi)和保留计数1创建NSString

所以@“”给出了一个NSString,其中包含是否必须释放?我对这个物体负责吗? 第二个代码示例让我感到困惑,尽管我是这样使用的:

NSSting *message;
message = [NSString stringWithFormat:@"Hello @%!",name];
//message = [NSString stringWithFormat:@"Hello Girl!"];
所以消息在下一次运行循环中被释放,k。但是作为stringWithFormat的参数给出的NSString有什么用呢

类对象NSString是否释放作为参数给出的NSString@“Hello%@”/“Hello Girl”?
或者“-Konstruktor”是否只返回自动释放的NSString?

NSString文字符号
@“
为您提供驻留在其自身内存空间中且具有恒定地址的编译时常量字符串

与流行的观点相反,不释放文本字符串的原因并不是因为它们是自动释放池的一部分。它们不是——相反,它们将应用程序的整个生命周期都花费在编译时分配的相同内存空间中,并且永远不会在运行时解除分配。它们只有在应用程序进程终止时才会被删除

也就是说,您唯一需要内存管理常量
NSString
s的时间是您自己保留或复制它们的时候。在这种情况下,应该释放保留或复制的指针,就像释放任何其他对象一样


另一件事:文字本身不需要内存管理。但是,如果您将它们作为参数传递给
NSString
的便利方法或初始值设定项,就像您对
stringWithFormat:
所做的那样,那么这些方法和初始值设定项返回的对象通常遵循所有内存管理规则。

关于常量/文字字符串的堆栈溢出的一些其他问题:
@“
不是一个宏,而是一个Objective-C字符串文字。我不会为此责备字符串的过度使用,因为它们的内存占用相对较低。如果使用
stringWithFormat:
创建字符串,它们将自动删除。如果您使用任何
init
方法创建字符串,您需要自己释放它们(或调用
autorelease
)。@Virus42:如果您创建的字符串类似于
NSString*a=@“a”,您永远不会释放
a
。但是如果以后执行
NSString*b=[[NSString alloc]initWithString:a]
,您需要释放
b
,因为
b
不是文本字符串。如果您执行
NSString*c=[a retain]
,你释放了
c
,因为你保留了一些东西。否则它是否会泄漏,我不确定,但若你们遵循内存管理规则,你们会没事的。在每个init/new/retain/copy中平衡一个release。@BoltClock您通常是对的,但有趣的是,在上面的示例中,
b
也是一个常量字符串,就像
a
一样。事实上,它们是同一个字符串。@Virus42:非常清楚,只有使用
@“
创建的字符串才是文本。@Virus42一般来说确实如此,您应该像BoltClock所说的那样管理内存。当参数是常量字符串时,
-initWithString:
具有不同的行为,而不是创建新字符串,而是返回参数本身。这只是一个实现细节,不应该影响您如何管理内存,但它仍然很有趣。