2011-06-13 74 views
2

在我的應用程序在某一點上,我對釋放使用我創建的對象:驗證對象發行

[myObject release]; 

我有一種感覺的東西是不是真的工作在那裏(我有一個錯誤,我無法捕捉,我有一個假設,它與內存分配有關)。我試圖在調試器中查看它,看起來該對象在「release」行運行後仍具有相同的值。

我錯過了什麼?

內存是否仍然被分配並被其他地方解僱?如果是這樣,在哪裏?

+1

將指針設置爲NULL也可能是一個好主意,以便您不要再次嘗試訪問此內存。 – Luke 2011-06-13 15:47:55

+0

請閱讀[內存管理編程指南](http://tinyurl.com/4lqj2yb)。它解釋了當你釋放一個對象,最終如何釋放對象以及你需要知道的許多其他事情時會發生什麼。 – Caleb 2011-06-14 07:04:26

回答

2

內存釋放時,通常不會清零。這意味着對象即使在釋放之後也會保持現狀 - 但不能再使用它們,因爲內存內容可能會在任何時刻被其他內容重用和覆蓋。

一個常見的簡單的一招是增加一個日誌聲明dealloc

- (void) dealloc 
{ 
    NSLog(@"Say bye to %@, kids!", self); 
    [super dealloc]; 
} 

這是非常簡單,它錯不了。當您正在進行調試時,這是一件好事,並且希望100%確定某件事情。

另一個不錯的工具是zombies。當你設置一個特殊的環境變量時,機器會保護對所有對象的訪問,並且當你嘗試訪問一個被釋放的對象時會尖叫。這也是一個相當可靠的工具。

然後是retainCount。這可能與您正在查找的內容非常接近,但它的格式爲not very dependable,因爲背景中有很多事情正在進行。如果你知道你在做什麼,你應該只使用它。

+1

我給你投了票,但你提到'retainCount' ... :-)我認爲把人們指向樂器比甚至提到那個(不聖潔)更有用。除此之外,很好的答案! – 2011-06-13 16:05:53

+1

有人說'retainCount'?啊,釋放獵犬! – 2011-06-13 18:24:42

+1

如果你知道你在做什麼,你不使用'retainCount'。 – bbum 2011-06-13 20:48:32

-3

而不是釋放它嘗試的,

myObject=NULL; 

NSLog(@"Retain count of myObject is %d", [myObject retainCount]); // Since retainCount returns an integer, we use %d to display it 

你會看到它的retaincount爲0

您還可以檢查myObject的值

NSLog(@"myObject Value after NULL = %@", myObject); 

myObject的值之後NULL =(空)

+1

retainCount永遠不會返回零。你的代碼沒有做你認爲的事。 – bbum 2013-03-15 13:51:38

+1

在沒有ARC的情況下,這會泄漏物體;你需要發送一個'release'或'autorelease'消息來釋放它。在ARC的存在下,將'nil'(或'NULL')賦值給變量通常是多餘的。 – 2013-03-15 19:33:07

+0

當我試圖得到使用上面的代碼retaincount輸出..它返回零。 @bbum – Vikr 2013-03-18 13:09:58