下面的代碼執行時會發生什麼?下面的代碼執行時會發生什麼? Ball * ball = [[[[Ball alloc] init] autorelease] autorelease];
Ball *ball = [[[[Ball alloc] init] autorelease] autorelease];
下面的代碼執行時會發生什麼?下面的代碼執行時會發生什麼? Ball * ball = [[[[Ball alloc] init] autorelease] autorelease];
Ball *ball = [[[[Ball alloc] init] autorelease] autorelease];
一旦給定對象autorelease
電話,現在你給它的發行責任autorelease pool
,現在它就像你沒有擁有它。它會顯示隨機行爲,它可能會崩潰或者有時沒有。(取決於當autorlease池釋放它,如果它的發行那麼它就會崩潰)
讓我們來分析一下:
[Ball alloc]
:這將創建一個我們自己的(因而需要釋放)一個球對象。
[[Ball alloc] init]
:這會初始化我們剛創建的Ball對象。
[[[Ball alloc] init] autorelease]
:這會將Ball添加到當前的自動釋放池,因此當該池被耗盡時它將被釋放。例如,如果我們要從方法返回球,這是正確的。
[[[[Ball alloc] init] autorelease] autorelease]
:這會再次釋放Ball對象。這是100%錯誤。 alloc
是我們需要平衡的唯一所有權聲明,因此球現在將被釋放太多次。這可能以任何方式表現出來,但它可能只會崩潰。
我嘗試了這個[[[[Ball alloc] init] autorelease] autorelease];它不會崩潰。你能告訴我什麼時候會崩潰嗎? – 2014-05-21 11:52:04
@SachinKumaram:這是未定義的行爲。沒有保證。一般來說,隨着分配更多的對象,它傾向於更容易崩潰。 – Chuck 2014-05-21 15:16:44
簡短回答:發生撞車事故。
這並不完全準確。它將保持有效,直到池被耗盡。它不會因爲您自動發佈而突然開始崩潰。 – Chuck 2011-04-19 15:12:05
是的,那是我在最後一行寫的。由於我們不知道在給定的代碼周圍是什麼,我們永遠無法確定它(不管他是否已經耗盡了)。 – Ravin 2011-04-20 03:11:05