我的问题是当前版本的 Foundation(或 Objective-C 运行时库,因为它似乎存在)如何实现 NSObject
派生对象的保留计数?正如我在 NSObject.mm 看到的那样, NSObject
的接口(interface)体中没有名为retain count
的ivar。相反,似乎有一种表或映射包含每个对象的引用计数器。但是,如果保留计数确实是用映射完成的,那么 retain
和 release
操作对于这种实现来说是不是太昂贵了(因为在这种情况下,有必要锁定并解锁互斥量,查找映射以找到正确的对象,此外,在多线程环境中,一次只能保留/释放一个对象)?
在分配新对象时,我没有发现任何与将保留计数器设置为 1 相关的内容,在 NSObject.mm 的 _objc_rootAllocWithZone
中也没有找到任何内容。 (这似乎是由 [NSObject alloc]
调用的函数)也不在 objc-runtime-new.mm 的 _class_createInstanceFromZone
中(稍后由 _objc_rootAllocWithZone
调用)。
最佳答案
NSObject
的保留计数确实保存在全局映射中。 IIRC 它实际上使用了一组分区的映射,大概是基于对象的地址,以减少锁争用,但实际的实现细节就是这样,实现细节。
无论如何,您找不到将保留计数设置为 1 的代码,因为根本没有。保留计数为 1 的对象不会放入映射中。对象只有在保留
超过初始 1 时才进入保留计数映射。这是一种优化,可以加快对象的保留计数从未超过 1 的常见情况。
关于objective-c - NSObject 中的保留计数是如何实现的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14905181/