2011-08-24 115 views
3

我收到一個錯誤「[myObject method]:發送到解除分配的實例0xbc05440的消息」。這一定是因爲我發佈了一些我仍然需要的東西。dealloc從哪裏開始?

我尋找適當的nils,發佈等,但我無法找到我釋放此對象的位置。

然後我在myObject的dealloc中放置了一個break。這捕獲了dealloc,但堆棧只顯示彙編代碼。如果我從這個地方走,我沒有得到任何提示。我如何找到dealloc的起始位置?

+0

你是專門保留它嗎?它可能正在被自動釋放。 –

+2

嘗試運行殭屍工具。 – Richard

回答

5

您的問題的可能懷疑是自動發佈變量。他們是鬼鬼祟祟的人,沒有你明確的釋放他們就會被釋放。所以請確保你沒有使用autoreleased變量,並期待它繼續存在。

至於你的具體問題,你實際上並不關心dealloc的調用棧。當你釋放某些東西時,永遠不會調用dealloc。對象的實際解除分配由應用程序的正常運行循環上下文之外的運行時處理,因此在此時查看調用堆棧將告訴您什麼都沒有。

你在乎的是release。如果你想知道你的對象何時被釋放,你可以覆蓋感興趣的對象中的釋放,並直接調用超級的實現。然後您可以在那裏設置一個斷點,以便在發佈時查看當前的調用堆棧。爲了清楚起見,應該是這樣的:

- (oneway void)release { 
    [super release]; // Put a breakpoint here. 
} 

只是要注意:您可能會看到更多的版本比您預期。這是因爲系統會很頻繁地在內部保留和釋放類,因此在確定哪些版本實際值得注意時需要謹慎使用。這種方法只是一個粗略的工具。 NSZombies對於追蹤過度釋放的對象也非常有用。

+0

神奇的解釋。我早些時候使用過nszombies,但它在這個問題上沒有幫助。發佈暫停像一個魅力。 – BankStrong