iOS 何时在运行时检查保留计数 table
When does iOS check retain count table on runtime
我读到(来自 Kazuki Sakamoto 和 Tomohiko Furumoto 写的一本书)在运行时 iOS 维护一个 hashtable
,其中对象的地址作为键,该对象的保留计数作为值。
如下所示:
key(object's addr) value(reference count)
0x7fff59a7ba88 2
0x7fa84b4b2c10 0
...
并且 iOS 运行时会检查 table 一次,看看是否有任何值为零的键,这意味着应该释放一些对象,然后 iOS 会删除那个键- 来自 table 的值对并调用 dealloc
释放对象的内存。
如果这个理论是正确的,那么我的问题是什么时候,用什么频率系统会检查reference count hashtable
?每个runloop
?或者 iOS 根本不会检查 table 而只是自动完成?
更新:
我刚刚更正了我的描述,它应该与 ARC 或 MRC 无关,更多的是关于运行时的引用计数。
这种行为听起来更像是垃圾回收,而不是 ARC 的工作方式。
ARC 的行为是完全确定的:它跟踪对一个对象的 strong
引用的数量,一旦该计数达到 0,该对象将立即被释放。您可以阅读实施细节 here.
我读到(来自 Kazuki Sakamoto 和 Tomohiko Furumoto 写的一本书)在运行时 iOS 维护一个 hashtable
,其中对象的地址作为键,该对象的保留计数作为值。
如下所示:
key(object's addr) value(reference count)
0x7fff59a7ba88 2
0x7fa84b4b2c10 0
...
并且 iOS 运行时会检查 table 一次,看看是否有任何值为零的键,这意味着应该释放一些对象,然后 iOS 会删除那个键- 来自 table 的值对并调用 dealloc
释放对象的内存。
如果这个理论是正确的,那么我的问题是什么时候,用什么频率系统会检查reference count hashtable
?每个runloop
?或者 iOS 根本不会检查 table 而只是自动完成?
更新:
我刚刚更正了我的描述,它应该与 ARC 或 MRC 无关,更多的是关于运行时的引用计数。
这种行为听起来更像是垃圾回收,而不是 ARC 的工作方式。
ARC 的行为是完全确定的:它跟踪对一个对象的 strong
引用的数量,一旦该计数达到 0,该对象将立即被释放。您可以阅读实施细节 here.