开发者

Objective-C retain counts in dealloc

I'm seeing something fairly strange here, I've got breakpoints set in various dealloc methods in my app, and on inspection, the retain counts of the object self varies from 1 to 0. When dealloc is called, will the retain count of the object be set to 0 already?

I'm using pri开发者_开发知识库nt (int) [self retainCount] in the console to test this.

The 0's seem to only appear in the dealloc of my NSOperation's that are being run in an NSOperationQueue.

Any idea why this is?


The retain count of your object doesn’t matter in -dealloc. For practical purposes, it’s undefined.

The normal implementation of reference counting uses an external reference count for values greater than zero – see NSIncrementExtraRefCount() and NSDecrementExtraRefCountWasZero(). When the extraRefCount count is zero, the refCount is one. When NSDecrementExtraRefCountWasZero() is called and the extraRefCount is already zero, it returns YES and -dealloc is called. Except when dealing with the return value of NSDecrementExtraRefCountWasZero() there is no way to distinguish a refCount of one from a refCount of zero.

That NSOperation gets a zero refCount suggests it’s not using the normal mechanism.


I'm not quite sure how objective-c handles this but if the dealloc method is being called, it means the retain count has hit 0 so object should be released from memory. There's no other way around it, if your object has a retainCount of 2 and you call [obj release] once, your dealloc method will never be called - so if your breakpoints are being hit and written to the Log then you can be sure that the object is on its way to being destroyed

Remember that your object will subclass NSObject so you should be putting a [super dealloc] call in your dealloc method too.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜