【发布时间】:2016-11-21 19:15:46
【问题描述】:
我读到(来自 Kazuki Sakamoto 和 Tomohiko Furumoto 写的一本书)在运行时 iOS 维护一个 hashtable,其中对象的地址作为键,该对象的保留计数作为值。
如下:
key(object's addr) value(reference count)
0x7fff59a7ba88 2
0x7fa84b4b2c10 0
...
iOS 运行时会每隔一段时间检查一次表,看看是否有任何值为 0 的键,这意味着应该释放一些对象,然后 iOS 会从表中删除该键值对并调用 dealloc 来释放对象的记忆。
如果这个理论是正确的,那么我的问题是,系统会在什么时候以什么频率检查reference count hashtable?每个runloop?还是 iOS 根本不会检查表格,只会自动完成?
更新:
我刚刚更正了我的描述,这应该与 ARC 或 MRC 无关,更多的是关于运行时的引用计数。
【问题讨论】:
-
这听起来不像 ARC,听起来像一个自动释放池。
-
@rmaddy 实际上它是 ARC 在运行时的基本机制,否则系统如何跟踪每个对象的保留计数?它必须将保留计数存储在某个数据结构中的某个位置,以便它可以检查和操作。它使用
ARC表,但是什么时候?这是我的问题。 -
没有。跟踪保留计数与 ARC 无关。对象早在 ARC 之前就有保留计数。 ARC 唯一添加的是编译器自动插入对
retain和release的调用。 ARC 和 MRC 代码在运行时是相同的。当一个对象的保留计数变为零时,它会被释放(ARC 或 MRC)。 -
@rmaddy 是的,我提到的表格并不特定于 ARC 或 MRC,但这就是 iOS 进行内存管理的方式,以及 iOS 如何根据编译器的保留计数在运行时保留或释放对象。我将编辑我的问题以进行更正。
-
类似的情况是
weak table,它将对象的地址作为键维护,并将它们的weak变量作为值指向它们。
标签: ios runtime automatic-ref-counting retain retaincount