簡體   English   中英

釋放釋放對象后會發生什么?

[英]What happens after I release a deallocated object?

我建立

object *Obj = [[Obj alloc] init];

對象保留計數為1。釋放它后,對象將被釋放。

如果我嘗試再次釋放該對象,將會發生什么?

EXT_BAD_ACCESS最有可能是因為您的對象引用不再有效。

代碼可能會崩潰。 但這在大多數時候都可以正常工作。

違反規則可能會被抓。 但是您可能同樣會擺脫它,一直生活在擔心自己以后會被抓住的恐懼中。

這里有一個重要的區別:您不能再次釋放該對象 ,因為該對象不再存在。 如果您向變量發送了另一條消息( release消息或其他消息),則該行為是不確定的,因為不再知道該變量指向有效對象。 (該變量現在指向的地址可能已被其他對象重用,在這種情況下它可能不會崩潰,但是當然這仍然是一個錯誤。)

獲取EXT_BAD_ACCESS。 由於您已經發布了它,現在嘗試再次發布。

您的對象引用不再有效。

一旦對象的保留計數達到0,它就會被釋放,並且所有進一步訪問它的嘗試都會導致隨機行為。

如果改用自動釋放,則保留計數不會降低,並且該對象將放入自動釋放池。 對象只有在到達自動釋放池排出命令時才會降低其保留計數,通常在更大范圍內以更高的級別執行該操作。 如果排空autoreleasepool后確實需要該對象,則應在執行排水之前將其保留,否則它將具有與我的第一段完全相同的行為。

暫無
暫無

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

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