【问题标题】:How does the ARC's zeroing weak pointer behavior implemented?ARC 的归零弱指针行为是如何实现的?
【发布时间】:2012-01-14 02:24:34
【问题描述】:

我正在学习 ARC。现在关于归零弱指针。 好的,我了解所有功能。 weak reference的语义和GC系统的weak reference是一样的,但是你知道,Objective-C不使用GC(特殊情况除外)所以我不明白它是怎么工作的。

我是一个有点复杂的人,所以我需要知道底层实现主体才能接受要使用的功能。但问题是很难找到描述归零弱指针原理的文档:(

IMO,使这项工作的唯一方法是跟踪并保持所有指针在运行时引用自身,并在其引用计数变为 0 时将它们全部设置为 nil。但这看起来太沉重和愚蠢。我相信在实际 ARC 实现中使用了更好的解决方案。

你能帮我找到文档吗?或者直接描述会更好!

【问题讨论】:

    标签: objective-c automatic-ref-counting


    【解决方案1】:

    这里有解释:

    http://mikeash.com/pyblog/friday-qa-2010-07-16-zeroing-weak-references-in-objective-c.html

    剧透:

    它的工作原理与您的想法差不多。每个类都维护一组指向它的弱指针地址,当调用它的 dealloc 时,它会将它们全部设置为零。

    这可能看起来很愚蠢,但它很快,因为不涉及“跟踪”,ARC 只是插入代码以在每次将对象分配给新的弱引用时添加指向该集合的指针。

    它实际上比垃圾收集中涉及的诡计要有效得多,后者基本上涉及在后台线程上遍历堆以查找指针并保留它们所指向的内容。

    【讨论】:

    • 事实上,在 ARC 下,编译器会发出代码来调用像 objc_storeWeakobjc_loadWeakRetain 这样的函数。这些函数是一个记录在案的 API:clang.llvm.org/docs/AutomaticReferenceCounting.html#runtime
    • 是的,这些函数就是它如何从存储在对象中的集合中添加和删除弱指针,正如我所说的,当我说“ARC 只是添加代码以添加指向该集合的指针时将对象分配给新的弱引用的时间”
    • 你知道弱指针是在对象的引用计数下降到 0 的那一刻,还是在它被解除分配的那一刻被清零?我现在遇到了一个“分配”指针的问题,在该指针中被引用的对象被重新使用,但仍然调用了它的 dealloc,因为它的引用计数在两者之间下降到 0。我想知道一个归零的弱指针是否可以解决这个问题。
    • ARC 规则!死于 GC。
    • 它们仍然有效(我相信)。
    【解决方案2】:

    在运行时由全局哈希表实现。 苹果来源:https://opensource.apple.com/source/objc4/objc4-647/runtime/objc-weak.mm

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-02-24
      • 1970-01-01
      • 1970-01-01
      • 2014-05-13
      • 2014-03-23
      • 2020-10-18
      • 1970-01-01
      • 2011-11-06
      相关资源
      最近更新 更多