文字 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”)是常量”但由于您没有通过传递allocretain 消息来初始化它们,所以您不能通过releaseautorelease 向他们发送消息,否则您的应用程序将崩溃并显示以下日志

"被释放的指针不是 分配”

NOTE

NSString *str = [NSString string];

相当于:

NSString *str = [[[NSString alloc] init] autorelease];

所以releaseautorelease也不能在这里传递。

【讨论】:

【参考方案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

自动释放并分配给 nil

NSString - stringWithFormat 自动释放

NSString componentsSeparatedByString: 返回自动释放的数组吗?

iOS中的所有对象都会自动添加到自动释放池中吗?

保留和释放 nsstring