2011-05-20 59 views
11

鉴于这种代码:@“某些文本”是否给出自动释放或保留1个对象?

// Initialize string 
NSString *name = @"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只回馈自动发布的NSStrings?

+1

关于常量/字符串堆栈溢出的一些其他问题:[1](http://stackoverflow.com/questions/1390334/nsstring-retain-count)[2](http://stackoverflow.com/问题/ 2768443/where-are-constant-nsstrings-allocated)[3](http://stackoverflow.com/questions/4804943/difference-bewteen-declaring-a-nsstring-with-alloc-and-init-and-分配 - )[4](http://stackoverflow.com/questions/2014667/memory-management-in-objective-c)[5](http://stackoverflow.com/questions/1320161/is-string-编译器优化编译) – 2011-05-20 09:04:53

+1

'@“”'不是一个宏,而是一个Objective-C字符串文字。 – 2011-05-20 09:07:01

回答

22

NSString文字符号@""为您提供编译时常量字符串,它们驻留在它们自己的内存空间中并具有常量地址。

与流行的看法相反,您不释放文字字符串的原因并不是因为它们是autorelease池的一部分。它们不是 - 相反,它们将整个应用程序的生命周期花费在它们在编译时分配的相同内存空间中,并且永远不会在运行时解除分配。只有当应用程序进程死亡时才会删除它们。

也就是说,唯一一次你需要记忆管理常数NSString s是当你自己保留或复制它们时。在这种情况下,您应该释放保留或复制的指针,就像您做任何其他对象一样。

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

+0

因此,当我的应用程序使用了很多内存时,使用@“”符号还是所有的NSString来到这个其他内存空间都不好?为什么我释放用NSString创建的NSString,我可以跳过吗(例如上面的对象名称)? – Binarian 2011-05-20 09:05:19

+2

我不会责怪过度使用字符串,因为它们的内存占用量相对较低。如果你使用'stringWithFormat:'来创建字符串,它们*是* autoreleased。如果使用任何'init'方法创建字符串,则需要自己释放它们(或称为'autorelease')。 – BoltClock 2011-05-20 09:07:33

+0

那么为什么发布,如果他们不真的被删除,因为他们留在自己的内存空间? – Binarian 2011-05-20 09:11:34

相关问题