2013-04-22 43 views
1

我已經使用alloc/init方法創建了一個對象,並且在我釋放它之後,應立即按文檔調用-dealloc。我在-dealloc方法上設置了一個斷點,但未命中,並且我的-dealloc方法未被調用。當我釋放特定對象時,不會調用Dealloc方法

請告訴我背後的原因是什麼,目標c中的dealloc方法有什麼用?

+0

http://stackoverflow.com/questions/559295/difference-between-release-and-dealloc-in-objective-c – Balu 2013-04-22 06:52:04

+3

請寄一些代碼嗎? – 2013-04-22 06:52:45

回答

3

當你期望它被調用時,並不總是調用-dealloc方法。由於內部原因,運行時也可能在您的對象上發佈了-retain

您也有可能(直接或間接)導致額外發行-retain。如果保留/分配和釋放不平衡,您永遠不會看到-dealloc調用。它有助於打開靜態分析儀,以確保您的通話平衡。

只要遵循內存管理規則,不要再次猜測運行時間,並讓內存管理系統完成其工作。

When does dealloc method call?的答案可能會幫助您瞭解所看到的內容。

-1

無論何時釋放對象,都會調用dealloc(在更多情況下)。你不能直接調用這個方法。

@interface myViewController:UIViewController 
{ 
    NSString *myStr; 
} 

@end 

在這裏,在的myViewController的@implementation的dealloc方法將被調用(在大多數情況下)的myViewController對象被釋放時,而不是當myStr被釋放。

雖然你不必使用,如果你ARC。

0

因爲它仍然有參考。這意味着其引用計數未達到零。我不知道你的代碼在哪裏引用。但它並沒有調用這個方法,但它仍然有參考價值。這可能是因爲關係或者親子關係

所有Objective-C的對象是在堆上分配的,所以他們必須 因此在某個地方,如果你不跑出來的 釋放資源。

這讓位於引用計數方法,該方法仍在今天使用 :每個對象都保留對它的任何引用的計數。如果您收到一個對象並且想要保留該對象,則保留該對象, 遞增其引用計數。當你完成它,你會釋放它,它減少了它的引用計數。一旦 的計數達到零,就會推斷沒有人引用該對象,並且使用-dealloc方法自動釋放該對象。

此外,可以通過使用自動釋放池來告知對象「在某個時間點在 (希望)不久的將來」釋放該對象。這個想法是 堆棧上的某處(通常在線程的開始或 響應輸入事件)創建自動釋放池並將 推送到堆棧上。任何對象然後可以被髮送一個-autorelease消息,並且它被分配給該池。

當池對象被釋放時,它只是發送一個「釋放」 消息給其所有分配的對象。這樣,任何沒有 更長時間使用的對象(即它們沒有被明確保留)然後解除分配 。

相關問題