我有这个基本问题,当我们尝试使用alloc init将内存分配给字符串并将其添加到autorelease池,然后尝试释放它时,它不会崩溃。释放自动释放的字符串对象不会崩溃
NSString *value = [[[NSString alloc] initWithString:@"Hello"] autorelease];
[value release];
如果我对数组做同样的事情,它会崩溃。 我只是想知道字符串是如何不同于数组,因为它们都从NSObject继承。
我有这个基本问题,当我们尝试使用alloc init将内存分配给字符串并将其添加到autorelease池,然后尝试释放它时,它不会崩溃。释放自动释放的字符串对象不会崩溃
NSString *value = [[[NSString alloc] initWithString:@"Hello"] autorelease];
[value release];
如果我对数组做同样的事情,它会崩溃。 我只是想知道字符串是如何不同于数组,因为它们都从NSObject继承。
你的意思是它不会马上崩溃吗? 也就是说在调试器中加入release
行后?
自动释放池在此时不会触发,因此自动释放操作仍然未完成。
无论哪种方式 - 按照一贯的内存错误,他们可能不崩溃
然而这是一个编程错误。
它从不崩溃。如果我初始化一个数组并执行相同的操作,只要执行释放语句就会崩溃。 – 2014-10-16 10:57:52
不保证程序崩溃。不幸的是,有几个错误不会导致崩溃(立即)。
但是,有一个字符串文字的优化。无论他们创建,保留或发布的方式,他们都会永远活着。 -initWithString:
可以足够聪明,不会返回NSString
的新实例。
首先,未定义的行为是undefined - 它不保证会崩溃或做任何其他特定的事情。过度释放是未定义的行为。
其次,这里发生的情况是,字符串文字评估为指向静态分配的字符串对象的指针,该对象在程序的整个生命周期内存在。它不是动态分配的,因此不受内存管理的限制。 retain
,release
等对它没有影响。 [[NSString alloc] initWithString:...]
(以及[... copy]
)在不可变字符串对象上直接保留并直接返回它的参数,因为不需要创建新对象。因此[[NSString alloc] initWithString:@"Hello"]
与@"Hello"
相同。
只是一个快速的一面的问题。你有没有理由不使用ARC? – Fogmeister 2014-10-16 10:44:47
没有理由。但我只是试图清楚地理解黑白字符串和其他对象之间的差异。 – 2014-10-16 10:59:19