gpt4 book ai didi

objective-c - 在 Objective C 中为 NSObjects 存储的保留计数在哪里

转载 作者:太空狗 更新时间:2023-10-30 03:27:36 26 4
gpt4 key购买 nike

我很好奇保留/释放在内部是如何工作的。从表面上看,似乎有一个整数与 NSObject 的每个实例相关。 ,当您调用 -retain 时它会增加和减少和 -release , 分别。

但是看看NSObject ,它唯一的实例变量是 isa变量,用于确定其类类型。

那么单个对象的保留计数存储在哪里?并不是说我要搞砸它,而是为了我自己的启发。

它是否与 NSObject 一起存储? ,但隐藏在一些 Objective C 实现细节中?如果是这样,那对我来说似乎是一个糟糕的设计。一个人应该能够创建他们自己的根类并以类似的方式处理他们自己的保留/释放计数(这不是一个好主意——一个人必须有一个非常 em> 不使用 NSObject 的充分理由)。

最佳答案

保留计数的存储位置取决于使用的运行时和类实现。

对于 Apple 的 Objective-C 运行时,您可以通过深入研究 the source code of the Objective-C runtime 来了解很多。 .

例如,如果您正在使用 ARC(我认为即使您没有使用),大多数对象的引用计数都存储在哈希表中。查看 runtime/objc-arr.mm 中的 _objc_rootRetain 函数。我不知道他们为什么这样做。也许这是一种将保留计数保持在一起以获得更好的缓存行为的方法(这在 ARC 下很重要,因为 ARC 比非 ARC 代码通常更频繁地调整保留计数)。

但是,某些类会覆盖 retain 和相关方法,并将保留计数存储在别处。例如,在调试内存泄漏时,我发现 CALayer 可以做到这一点。 CALayer 不是使用运行时的正常保留计数机制,而是将其保留计数存储在私有(private) C++ 实现对象中。这相当令人沮丧,因为这意味着 Instruments Allocations 工具不会记录 CALayer 对象的保留和释放。

关于objective-c - 在 Objective C 中为 NSObjects 存储的保留计数在哪里,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10109645/

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