我有這個基本問題,當我們嘗試使用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