2011-04-13 127 views
0

我創建我釋放一個釋放對象後會發生什麼?

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

的OBJ保留數爲1之後,我放開,對象被釋放。

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

+7

代碼,編譯,請自己看看? – scalbatty 2011-04-13 11:43:42

+0

@luzal:你離rtfm不遠......我認爲這不是一個好主意。 – 2011-04-13 12:10:26

回答

5

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

1

代碼可能會崩潰。但是大部分時間它也可能工作。

你制動一個規則,你可能會被抓住。但你也可以放棄它,生活在不斷擔心的事情中,以後可能會被抓住。

0

獲取EXT_BAD_ACCESS。因爲你已經釋放它,現在試圖再次釋放。

您的對象引用不再有效。

+3

發送任何消息到一個無對象什麼都不做。 – Till 2011-04-13 11:56:22

+2

Oh boy .. Calling [nil release];不會有任何傷害,不需要檢查這個。但是,[myObj版本]不會將myObj設置爲NULL,因此當您想要確保您無法將版本釋放時,您很可能會雙倍釋放它。 – JustSid 2011-04-13 11:58:05

+0

沒有Objective-C中的NullPointerException ... – fabian789 2011-04-13 15:03:40

0

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

如果使用autorelease來代替,保留計數不會被降低,並且該對象將被放入autoreleasepool中。一旦達到autoreleasepool drain命令,該對象只會降低其保留計數,通常在更廣泛的範圍內以更高的級別完成。如果您在autoreleasepool耗盡後確實需要該對象,則應在執行drain之前保留該對象,否則它將具有與第一段中完全相同的行爲。

1

有在這裏做出一個重要的區別:你無法釋放對象再次,因爲對象不再存在。如果您向變量(即release或任何其他消息)發送另一個消息,則行爲未定義,因爲該變量不再指向有效的對象。 (可能變量現在指向的地址將被重用於不同的對象,在這種情況下,它可能不會崩潰,但當然這仍然是一個錯誤。)