在我的應用程序在某一點上,我對釋放使用我創建的對象:驗證對象發行
[myObject release];
我有一種感覺的東西是不是真的工作在那裏(我有一個錯誤,我無法捕捉,我有一個假設,它與內存分配有關)。我試圖在調試器中查看它,看起來該對象在「release」行運行後仍具有相同的值。
我錯過了什麼?
內存是否仍然被分配並被其他地方解僱?如果是這樣,在哪裏?
在我的應用程序在某一點上,我對釋放使用我創建的對象:驗證對象發行
[myObject release];
我有一種感覺的東西是不是真的工作在那裏(我有一個錯誤,我無法捕捉,我有一個假設,它與內存分配有關)。我試圖在調試器中查看它,看起來該對象在「release」行運行後仍具有相同的值。
我錯過了什麼?
內存是否仍然被分配並被其他地方解僱?如果是這樣,在哪裏?
內存釋放時,通常不會清零。這意味着對象即使在釋放之後也會保持現狀 - 但不能再使用它們,因爲內存內容可能會在任何時刻被其他內容重用和覆蓋。
一個常見的簡單的一招是增加一個日誌聲明dealloc
:
- (void) dealloc
{
NSLog(@"Say bye to %@, kids!", self);
[super dealloc];
}
這是非常簡單,它錯不了。當您正在進行調試時,這是一件好事,並且希望100%確定某件事情。
另一個不錯的工具是zombies。當你設置一個特殊的環境變量時,機器會保護對所有對象的訪問,並且當你嘗試訪問一個被釋放的對象時會尖叫。這也是一個相當可靠的工具。
然後是retainCount。這可能與您正在查找的內容非常接近,但它的格式爲not very dependable,因爲背景中有很多事情正在進行。如果你知道你在做什麼,你應該只使用它。
我給你投了票,但你提到'retainCount' ... :-)我認爲把人們指向樂器比甚至提到那個(不聖潔)更有用。除此之外,很好的答案! – 2011-06-13 16:05:53
有人說'retainCount'?啊,釋放獵犬! – 2011-06-13 18:24:42
如果你知道你在做什麼,你不使用'retainCount'。 – bbum 2011-06-13 20:48:32
而不是釋放它嘗試的,
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 =(空)
將指針設置爲NULL也可能是一個好主意,以便您不要再次嘗試訪問此內存。 – Luke 2011-06-13 15:47:55
請閱讀[內存管理編程指南](http://tinyurl.com/4lqj2yb)。它解釋了當你釋放一個對象,最終如何釋放對象以及你需要知道的許多其他事情時會發生什麼。 – Caleb 2011-06-14 07:04:26