如何在NSObject中实现保留计数?

时间:2013-02-15 23:40:43

标签: objective-c cocoa nsobject objective-c-runtime retaincount

我的问题是当前版本的Foundation(或Objective-C运行时库,因为它似乎在那里)如何实现NSObject派生对象的保留计数?正如我在NSObject.mm看到的那样,retain count的界面体中没有名为NSObject的ivar。相反,似乎有一种表或映射包含每个对象的引用计数器。但是如果保留计数确实是通过映射完成的,那么这种实现方式的retainrelease操作都不会太昂贵(因为在这种情况下,需要锁定和解锁互斥锁,查找map,以找到正确的对象,除了在多线程环境中,一次只能保留/释放一个对象的事实)?

我没有找到任何与分配新对象时将retain计数器设置为1相关的任何内容,_objc_rootAllocWithZone NSObject.mm {似乎是{{1}调用的函数}}} [NSObject alloc] objc-runtime-new.mm_class_createInstanceFromZone稍后被_objc_rootAllocWithZone调用。)

1 个答案:

答案 0 :(得分:10)

NSObject的保留计数确实保存在全局地图中。 IIRC它实际上使用了一组被分区的映射,可能是基于对象的地址,以减少锁争用,但实际的实现细节就是实现细节。

在任何情况下,您都找不到将保留计数设置为1的代码,因为没有任何代码。保留计数为1的对象不会放入地图中。对象仅在retain超过初始值1时才输入保留计数映射。这是一种优化,可以加速从未使其保留计数超过1的对象的常见情况。