【问题标题】:When does iOS check retain count table on runtimeiOS 何时在运行时检查保留计数表
【发布时间】: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 唯一添加的是编译器自动插入对retainrelease 的调用。 ARC 和 MRC 代码在运行时是相同的。当一个对象的保留计数变为零时,它会被释放(ARC 或 MRC)。
  • @rmaddy 是的,我提到的表格并不特定于 ARC 或 MRC,但这就是 iOS 进行内存管理的方式,以及 iOS 如何根据编译器的保留计数在运行时保留或释放对象。我将编辑我的问题以进行更正。
  • 类似的情况是weak table,它将对象的地址作为键维护,并将它们的weak变量作为值指向它们。

标签: ios runtime automatic-ref-counting retain retaincount


【解决方案1】:

这种行为听起来更像是垃圾回收,但并不是 ARC 的工作原理。

ARC 的行为是完全确定性的:它跟踪对对象的strong 引用的数量,一旦该计数达到 0,该对象就会立即被释放。您可以阅读有关实现细节here

【讨论】:

  • 我了解 ARC/MRC 在编译过程中做了什么,但是 iOS 在运行时为内存管理做了什么?不是有一张表来记录所有使用的内存和引用计数吗?无论如何,table 的东西是从书中读到的。
  • 每当调用 -release 时,运行时都会检查引用计数。它不会像您想的那样轮询引用计数。
  • 这个答案具有误导性。它不是特定于 ARC 的。这种描述同样适用于 MRC。
  • 你说得对:也许我应该指定它是自动的?并且编译器通过 objc_release() 和朋友来做到这一点?
  • 其实我想知道的是,根据@caughtinflux,每当调用release 时,运行时都会去检查引用计数。是的,它不是特定于 ARC 或 MRC,它是一种通用的内存管理理念。而且我已经编辑了我的问题和描述以避免任何误导。
猜你喜欢
  • 2011-11-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-18
  • 2016-02-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多