Objective-C保留dealloc中的计数

时间:2010-05-30 15:52:58

标签: objective-c cocoa

我在这里看到一些相当奇怪的东西,我在我的应用程序中的各种dealloc方法中设置了断点,并且在检查时,对象self的保留计数从1到0不等。当调用dealloc时,对象的保留计数是否已设置为0?

我在控制台中使用print (int) [self retainCount]来测试它。

0似乎只出现在我dealloc的{​​{1}} NSOperation中。

知道为什么会这样吗?

2 个答案:

答案 0 :(得分:8)

-dealloc中对象的保留计数无关紧要。出于实际目的,它是未定义的。

引用计数的正常实现使用大于零的值的外部引用计数 - 请参阅NSIncrementExtraRefCount()NSDecrementExtraRefCountWasZero()。当extraRefCount计数为零时,refCount为1。调用NSDecrementExtraRefCountWasZero()并且extraRefCount已经为零时,它将返回YES并调用-dealloc。除了处理NSDecrementExtraRefCountWasZero()的返回值之外,无法区分refCount为1和refCount为零。

NSOperation获得零refCount表示它没有使用正常机制。

答案 1 :(得分:-1)

我不太确定objective-c如何处理这个问题,但是如果调用dealloc方法,则意味着保留计数已经达到0,因此应该从内存中释放对象。没有别的方法,如果你的对象有一个retainCount为2并且你调用[obj release]一次,你的dealloc方法永远不会被调用 - 所以如果你的断点被击中并写入日志然后你就可以肯定了该对象正在被销毁的途中

请记住,你的对象将继承NSObject,所以你也应该在你的dealloc方法中调用[super dealloc]。