2014-10-16 97 views
1

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

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

如果我对数组做同样的事情,它会崩溃。 我只是想知道字符串是如何不同于数组,因为它们都从NSObject继承。

+0

只是一个快速的一面的问题。你有没有理由不使用ARC? – Fogmeister 2014-10-16 10:44:47

+0

没有理由。但我只是试图清楚地理解黑白字符串和其他对象之间的差异。 – 2014-10-16 10:59:19

回答

2

你的意思是它不会马上崩溃吗? 也就是说在调试器中加入release行后?

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

无论哪种方式 - 按照一贯的内存错误,他们可能不崩溃

  • 瞬间
  • 你的机器/操作系统上,
  • 具体建,
  • with您当前的构建设置,
  • ...
  • 甚至根本没有。

然而这是一个编程错误。

+0

它从不崩溃。如果我初始化一个数组并执行相同的操作,只要执行释放语句就会崩溃。 – 2014-10-16 10:57:52

2

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

但是,有一个字符串文字的优化。无论他们创建,保留或发布的方式,他们都会永远活着。 -initWithString:可以足够聪明,不会返回NSString的新实例。

0

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

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