文字 NSString 是自动释放还是需要释放?
Posted
技术标签:
【中文标题】文字 NSString 是自动释放还是需要释放?【英文标题】:Is a literal NSString autoreleased or does it need to be released? 【发布时间】:2010-09-24 16:54:51 【问题描述】:使用以下符号创建字符串时:
NSString *foo = @"Bar";
需要释放foo
吗?还是foo
在这种情况下自动释放?
【问题讨论】:
很抱歉添加答案太晚了,但我认为你应该检查它的完整性,因为本的答案有一些错误。 【参考方案1】:我同意@Ben\ Gottlieb 在“编译器分配的字符串(格式为@“STRING”)是常量”但由于您没有通过传递alloc
或retain
消息来初始化它们,所以您不能通过release
或 autorelease
向他们发送消息,否则您的应用程序将崩溃并显示以下日志
"被释放的指针不是 分配”
NOTE
NSString *str = [NSString string];
相当于:
NSString *str = [[[NSString alloc] init] autorelease];
所以release
或autorelease
也不能在这里传递。
【讨论】:
【参考方案2】:如文档中所述
http://developer.apple.com/documentation/Cocoa/Conceptual/MemoryMgmt/Tasks/MemoryManagementRules.html
如果你拥有一个对象的所有权 使用其名称的方法创建它 以“alloc”或“new”或 包含“copy”(例如,alloc, newObject 或 mutableCopy),或者如果您 向其发送保留消息。你是 负责放弃 您拥有的对象的所有权 释放或自动释放。任何其他时间 你收到一个对象,你不能 释放它。
由于您没有使用 alloc、copy 等,因此您无需担心释放对象。
【讨论】:
ARC 之后有什么变化吗?我读到字符串文字留在内存中,并在程序停止运行时被销毁。应该更喜欢使用alloc而不是文字来创建字符串?【参考方案3】:编译器分配的字符串(格式为@"STRING")是常量,因此给它们的-retain、-release 和-autorelease 消息将被忽略。在这种情况下,您不必释放或自动释放 foo(但它不会受到伤害)。
【讨论】:
我发现释放 foo 会导致我的程序因“未分配指针被释放”而崩溃 @bobobobo 我完全同意你的看法。以上是关于文字 NSString 是自动释放还是需要释放?的主要内容,如果未能解决你的问题,请参考以下文章
NSString - stringWithFormat 自动释放