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

Lui*_*BOL 5 cocoa objective-c objective-c-runtime nsobject retaincount

我的问题是当前版本的Foundation(或Objective-C运行时库,因为它似乎在那里)如何实现NSObject派生对象的保留计数?正如我在NSObject.mm上看到的那样,retain countNSObject界面体中没有调用ivar .相反,似乎有一种表或映射包含每个对象的引用计数器.但是,如果保留计数真的与地图做,是不是retainrelease行动与这种实现(因为太贵了,在这种情况下,有必要锁定和解锁互斥,查找地图,找到合适的对象,除了事实那么,在多线程环境中,一次只能保留/释放一个对象)?

我没有找到相关的新对象的分配时,保留计数器设置为1东西,无论是在_objc_rootAllocWithZoneNSObject.mm(这似乎是被调用的函数[NSObject alloc])也不_class_createInstanceFromZoneobjc-runtime-new.mm(即后来被称为_objc_rootAllocWithZone.

Lil*_*ard 10

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

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

  • @ LuisAntonioBotelhoO.Leite:这会使系统上每个对象的大小增加4-8个字节(取决于架构).这可能导致整个类对象上升一个malloc桶大小(例如16到32个字节).还有*很多*对象永远不会超过保留计数1,这会导致这些对象不必要地浪费空间. (3认同)