2011-04-19 36 views

回答

0

一旦給定對象autorelease電話,現在你給它的發行責任autorelease pool,現在它就像你沒有擁有它。它會顯示隨機行爲,它可能會崩潰或者有時沒有。(取決於當autorlease池釋放它,如果它的發行那麼它就會崩潰)

+0

這並不完全準確。它將保持有效,直到池被耗盡。它不會因爲您自動發佈而突然開始崩潰。 – Chuck 2011-04-19 15:12:05

+0

是的,那是我在最後一行寫的。由於我們不知道在給定的代碼周圍是什麼,我們永遠無法確定它(不管他是否已經耗盡了)。 – Ravin 2011-04-20 03:11:05

26

讓我們來分析一下:

[Ball alloc]:這將創建一個我們自己的(因而需要釋放)一個球對象。

[[Ball alloc] init]:這會初始化我們剛創建的Ball對象。

[[[Ball alloc] init] autorelease]:這會將Ball添加到當前的自動釋放池,因此當該池被耗盡時它將被釋放。例如,如果我們要從方法返回球,這是正確的。

[[[[Ball alloc] init] autorelease] autorelease]:這會再次釋放Ball對象。這是100%錯誤。 alloc是我們需要平衡的唯一所有權聲明,因此球現在將被釋放太多次。這可能以任何方式表現出來,但它可能只會崩潰。

+0

我嘗試了這個[[[[Ball alloc] init] autorelease] autorelease];它不會崩潰。你能告訴我什麼時候會崩潰嗎? – 2014-05-21 11:52:04

+0

@SachinKumaram:這是未定義的行爲。沒有保證。一般來說,隨着分配更多的對象,它傾向於更容易崩潰。 – Chuck 2014-05-21 15:16:44

1

簡短回答:發生撞車事故。