@"some text"是否会自动释放或保留1个对象?

Bin*_*ian 11 memory-management objective-c autorelease

鉴于此代码:

// Initialize string
NSString *name = @"Franzi";
Run Code Online (Sandbox Code Playgroud)

@""宏创建一个带有给定文本的NSString(这里名称为Franzi)和一个RETAIN COUNT OF 1?

所以@""给出了一个必须被释放的NSString?我对这个对象负责吗?第二个代码示例然后让我感到困惑,即使我这样使用它:

NSSting *message;
message = [NSString stringWithFormat:@"Hello @%!",name];
//message = [NSString stringWithFormat:@"Hello Girl!"];
Run Code Online (Sandbox Code Playgroud)

因此消息在下一个运行循环中释放,k.但是作为stringWithFormat的参数给出的NSString是什么?

类对象NSString是否释放了作为争论的NSString @"Hello%@"/ @"Hello Girl"?或@"" - Konstruktor只回馈自动释放的NSStrings?

Bol*_*ock 22

NSString文字符号@""给你编译时驻留在自己的内存空间,并有固定的地址常量字符串.

与流行的看法相反,您不释放文字字符串的原因不是因为它们是自动释放池的一部分.它们不是 - 相反,它们将整个应用程序的生命周期花在它们在编译时分配的相同内存空间中,并且永远不会在运行时释放.它们仅在应用程序进程终止时被删除.

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

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

  • @ Virus42这一般的确如此,你应该像BoltClock所说的那样管理内存.当参数是一个常量字符串时,`-initWithString:`有不同的行为 - 而不是创建一个新字符串,它返回参数本身.它只是一个实现细节,不应该影响你如何管理内存,但它仍然很有趣. (3认同)
  • 我不会因为内存占用相对较少而责怪过度使用字符串.如果你使用`stringWithFormat:`创建字符串,它们*是*自动释放的.如果你使用任何`init`方法来创建字符串,你需要自己释放它们(或调用`autorelease`). (2认同)
  • @ Virus42:如果你创建一个像`NSString*a = @"的字符串a";`,你永远不会释放`a`.但是如果你以后做`NSString*b = [[NSString alloc] initWithString:a];`,你需要释放`b`,因为`b`不是文字字符串.如果你做`NSString*c = [a retain];`,你释放`c`是因为你保留了一些东西.是否会泄漏,否则我不确定,但如果你遵守内存管理规则,你会没事的.使用版本平衡每个init/new/retain/copy. (2认同)
  • @BoltClock你一般都是对的,但是在上面的例子中,`b`也是一个常量字符串,就像`a`一样,这很有趣.实际上,它们是相同的字符串. (2认同)