gpt4 book ai didi

objective-c - NSObject 中的保留计数是如何实现的?

转载 作者:太空狗 更新时间:2023-10-30 03:48:58 24 4
gpt4 key购买 nike

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

在分配新对象时,我没有发现任何与将保留计数器设置为 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com