My question is how the current versions of Foundation (or of the Objective-C runtime library, since this seems to be there) implement retain count for NSObject
derived objects? As I could see at NSObject.mm, there is no ivar called retain count
in the NSObject
's interface body. Instead, there seems to be a kind of table or map which contains references counters for each object. But if retain count is really done with a map, aren't retain
and release
operations too expensive with this kind of implementation (since, in this case, it's necessary to lock and unlock mutexes, lookup the map to find the right object, besides the fact that, in a multithreaded environment, only one object can be retained/released at a time)?
I didn't find anything related to setting the retain counter to 1 when allocating a new object, neither in _objc_rootAllocWithZone
at NSObject.mm (which seems to be the function that is called by [NSObject alloc]
) nor in _class_createInstanceFromZone
at objc-runtime-new.mm (that gets called later by _objc_rootAllocWithZone
).
The retain count for NSObject
is indeed kept in a global map. IIRC it actually uses a set of maps that are partitioned, presumably based on the address of the object, to reduce lock contention, but the actual implementation details are just that, implementation details.
In any case, you can't find code that sets the retain count to 1 because there isn't any. Objects with a retain count of 1 aren't put into the map. Objects only enter the retain count map when they're retain
ed past the initial 1. This is an optimization that speeds up the common case of objects that never have their retain count rise past 1.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With