鉴于此代码:
// Initialize string
NSString *name = @"Franzi";
@“”宏创建一个带给定文本的NSString(这里是名字Franzi)和一个RETAIN COUNT OF 1?
所以@“”给出了一个必须释放的NSString?我对这个对象负责吗? 第二个代码示例然后让我感到困惑,即使我这样使用它:
NSSting *message;
message = [NSString stringWithFormat:@"Hello @%!",name];
//message = [NSString stringWithFormat:@"Hello Girl!"];
因此消息在下一个运行循环中释放,k。但是作为stringWithFormat的参数给出的NSString是什么?
类对象NSString是否会释放NSString @“Hello%@”/ @“Hello Girl”作为争论? 或@“” - Konstruktor只回馈自动释放的NSStrings?
答案 0 :(得分:22)
NSString
文字符号@""
为您提供编译时常量字符串,这些字符串驻留在自己的内存空间中并具有常量地址。
与流行的看法相反,您不释放文字字符串的原因并不是因为它们是自动释放池的一部分。它们不是 - 相反,它们将整个应用程序的生命周期花在它们在编译时分配的相同内存空间中,并且永远不会在运行时释放。它们仅在应用程序进程终止时被删除。
也就是说,你需要内存管理常量NSString
的唯一时间就是你自己保留或复制它们。在这种情况下,您应该释放保留或复制的指针,就像您执行任何其他对象一样。
另一件事:文字本身不需要内存管理。但是,如果将它们作为参数传递给NSString
的便捷方法或初始值设定项,就像使用stringWithFormat:
一样,那么它就是通常遵循所有内存管理规则的方法和初始化程序返回的那些对象。