2010-05-30 31 views
3

我在這裏看到一些相當奇怪的事情,我在我的應用程序中的各種dealloc方法中設置了斷點,在檢查時,對象self的保留計數從1到0不等。當調用dealloc時,對象的保留計數是否已設置爲0?Objective-C在dealloc中保留計數

我在控制檯中使用print (int) [self retainCount]來測試它。

0似乎只出現在我的NSOperationdealloc中,這些文件在NSOperationQueue中運行。

任何想法,爲什麼這是?

回答

8

對象的保留數在-dealloc中無關緊要。出於實用目的,它是不確定的。

引用計數的正常實現對大於零的值使用外部引用計數 - 請參閱NSIncrementExtraRefCount()NSDecrementExtraRefCountWasZero()。當extraRefCount計數爲零時,refCount爲1。當調用NSDecrementExtraRefCountWasZero()且extraRefCount已爲零時,它將返回YES並調用-dealloc。除了處理返回值NSDecrementExtraRefCountWasZero()時,無法區分refCount和0的refCount。

NSOperation得到一個零refCount表明它沒有使用正常的機制。

+1

除'-dealloc'之外,如果在調用dealloc時存在'retain',那麼程序已經死了,並且在該調用之前已經有一段時間了。 – bbum 2010-05-30 18:38:11

-1

我不太清楚objective-c如何處理這個問題,但是如果調用dealloc方法,這意味着保留計數已經達到0,所以對象應該從內存中釋放。沒有其他解決方法,如果你的對象的retainCount爲2,並且你調用[obj release]一次,那麼你的dealloc方法將永遠不會被調用 - 所以如果你的斷點被命中並寫入Log,那麼你可以確定該對象是在銷燬的途中

請記住,您的對象將繼承NSObject,因此您應該在dealloc方法中放置[super dealloc]調用。