释放自动释放字符串对象不会崩溃

Posted

技术标签:

【中文标题】释放自动释放字符串对象不会崩溃【英文标题】:Releasing an autoreleased string object doesnt crash 【发布时间】:2014-10-16 10:42:43 【问题描述】:

我有一个基本问题,当我们尝试使用 alloc init 为字符串分配内存并将其添加到自动释放池中,然后尝试释放它时,它不会崩溃。

NSString *value = [[[NSString alloc] initWithString:@"Hello"] autorelease]; 
[value release];

如果我对数组做同样的事情,它就会崩溃。 我只想知道字符串与数组有何不同,因为两者都继承自 NSObject。

【问题讨论】:

只是一个小问题。您有什么理由不使用 ARC? 没有理由。但我只是想清楚地了解 b/w nsstring 和其他对象的差异。 【参考方案1】:

你的意思是它不会马上崩溃吗? IE。跨过release 行后在调试器中?

此时自动释放池不会触发,因此自动释放操作仍未完成。

无论哪种方式 - 与内存错误一样,它们可能不会崩溃

立即在您的机器上/操作系统, 有了这个特定的内置, 使用您当前的构建设置, ... 甚至根本没有。

这是一个编程错误。

【讨论】:

它永远不会崩溃。如果我初始化一个数组并做同样的事情,它会在执行 release 语句时立即崩溃。【参考方案2】:

不保证程序会崩溃。不幸的是,有几个错误不会(立即)导致崩溃。

但是,对字符串文字进行了优化。无论它们是如何被创造、保留或释放的,它们都永远活着。 -initWithString: 可以足够聪明,不会返回 NSString 的新实例。

【讨论】:

【参考方案3】:

首先,未定义的行为是undefined——不能保证它会崩溃或做任何其他特定的事情。过度释放是未定义的行为。

其次,这里发生的事情是字符串文字评估为指向静态分配的字符串对象的指针,该对象在程序的生命周期内都存在。它不是动态分配的,因此不受内存管理的影响。 retainrelease等对其没有影响。不可变字符串对象上的[[NSString alloc] initWithString:...](以及[... copy])只是简单地保留并直接返回其参数,因为不需要创建新对象。所以[[NSString alloc] initWithString:@"Hello"]@"Hello" 是一样的。

【讨论】:

以上是关于释放自动释放字符串对象不会崩溃的主要内容,如果未能解决你的问题,请参考以下文章

双重释放自动释放的对象不会崩溃

NSURLRequest 自动释放:崩溃

如何找到带有自动释放消息的对象?

当我创建 DDXMLDocument 的自动释放对象时,我的应用程序崩溃了

NSString 释放时崩溃

当自动释放池耗尽时,NSFileAttributes dealloc 中的 SIGSEGV SEGV_ACCERR 崩溃?