2011-04-05 56 views
3

我有Cocoa桌面應用程序,就像很多人使用NSDates一樣。現在,其中一個NSDates正在成爲殭屍。它被用在NSUndoManager的堆棧中,所以我認爲這是我不太瞭解的東西。但沒關係,因爲我打算使用Instruments來找出它被保留和釋放的位置。除了樂器表現出非常奇怪的行爲(但是我曾經見過一次或兩次之前的行爲)。我已經張貼截圖在http://taubler.com/zombie.png,並試圖重現儀器的痕跡在這裏:樂器和殭屍;保留計數是1,2,然後突然-1!

0 __NSCFDate Malloc 1 00:08.416.441 0x114a92150 16 Foundation getObjectValue 
1 __NSCFDate Autorelease  00:08.416.462 0x114a92150 0 Foundation getObjectValue 
2 __NSCFDate Retain 2 00:08.416.576 0x114a92150 0 Proxy -[SPTask setStart:] 
3 __NSCFDate Release 1 00:09.815.661 0x114a92150 0 Foundation -[NSAutoreleasePool drain] 
4 __NSCFDate Retain 2 00:10.703.345 0x114a92150 0 Proxy -[DraggingTask setOrigStart:] 
5 __NSCFDate Release 1 00:10.871.257 0x114a92150 0 Proxy -[SPTask setStart:] 
6 __NSCFDate Retain 2 00:11.482.473 0x114a92150 0 Foundation -[NSCFArray insertObject:atIndex:] 
7 __NSCFDate Zombie -1 00:18.639.856 0x114a92150 0 Proxy -[SPTask setStart:] 

注意如何保留計數跳到2至-1。有誰知道爲什麼會發生這種情況?它確實很難找到流氓釋放...

在此先感謝!

+2

是直接調用dealloc的東西嗎? – drewag 2011-04-05 02:22:51

+1

有趣的問題。也許我會看看我是否可以繼承NSDate並在dealloc中放置一個斷點。 – 2011-04-05 04:13:42

+1

丁丁,我們贏了!這正是發生的事情。現在,如果drewag正式回答了這個問題,我可以投票贊成。 :) – 2011-04-05 04:18:39

回答

8

如果您直接調用dealloc對象(應該永遠不會這樣做),就會發生這種情況。

+0

+1真棒洞察力。我在看這些數據,想着「這裏究竟發生了什麼?!」 – 2011-04-05 04:48:50

+0

同意。對我來說這是一個完全的腦力激盪 - 在我的類的dealloc方法中調用dealloc(而不是釋放)NSDate對象 - 當只是盯着代碼時,它看起來是正確的。 – 2011-04-05 17:27:09