2014-10-16 99 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"相同。