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

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

我的问题是当前版本的 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/

相关文章:

ios - 选择器中具有不同参数类型的 respondsToSelector

iphone - 将名称和电子邮件存储在数组列表中时,创建具有电子邮件和名称属性的对象播放器是可行的方法吗?

objective-c - cocoa objective-c类中变量前面的下划线如何工作?

ios - ios8如何保持后台持续获取位置?

ios - 如何在 objective-c 中以编程方式更改字体样式

iphone - 请求发送获取错误 : [CFString release]: message sent to deallocated instance 0x6a83e00

HTML 资源在 Debug模式下正确加载,而不是在 Release模式下正确加载

cocoa - NSStackView 中的隐藏 View 未隐藏?

objective-c - writeToFile 给出 NSUnderlyingError=0x6a3d450 "The operation couldn’ t 完成。是一个目录”

ios - 如何禁止 NSObject 中的基本 init 方法