簡體   English   中英

以下代碼執行時會發生什么? Ball * ball = [[[ball alloc] init] autorelease] autorelease];

[英]What happens when the following code executes? Ball *ball = [[[[Ball alloc] init] autorelease] autorelease];

以下代碼執行時會發生什么?

Ball *ball = [[[[Ball alloc] init] autorelease] autorelease];

讓我們分解一下:

[Ball alloc] :這會創建一個我們擁有的Ball對象(因此需要釋放)。

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

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

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

簡短的回答:隨之而來的是崩潰。

一旦你給出了對象autorelease調用,現在你已經將它的釋放責任交給autorelease pool ,現在它就像你沒有擁有它一樣。它會顯示它可能崩潰或有時不會出現的隨機行為。(取決於何時自動釋放池釋放它,如果它的發布然后它會崩潰)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM