【问题标题】:Why Reference Counters All Start with +1?为什么引用计数器都以 +1 开头?
【发布时间】:2020-11-25 20:51:22
【问题描述】:

根据swift/stdlib/public/SwiftShims/RefCount.h

- The strong RC is stored as an extra count: when the physical field is 0 the logical value is 1.
- The unowned RC also has an extra +1 on behalf of the strong references
- The weak RC also has an extra +1 on behalf of the unowned references

我想知道为什么一个对象初始化时所有计数器都为 +1,制作额外的有什么意义?

【问题讨论】:

  • 我已经发布了我的最佳猜测作为答案。如果您想获得更权威的答案,请尝试在 the official Swift Forums 上提问,RefCount.h 文件的实际作者有时会回复。

标签: ios objective-c swift


【解决方案1】:

unowned 计数存储在对象的直接分配存储中。当 unowned 引用被销毁时,运行时会减少 unowned 计数。如果递减的计数仍然高于零,则运行时知道至少还有一个strongunowned 对该对象的引用,因此运行时知道它不应该释放对象的存储空间。 (存储一直分配到对象的所有strongunowned 引用被销毁。)因此,当运行时销毁unowned 引用时,它不必检查strong 计数来知道是否释放存储空间。如果在最后一个 strong 引用被销毁之前销毁所有 unowned 引用,这可以节省时间。

weak 计数存储在对象的“side table”条目中,直到需要时才会分配(通常是在创建对对象的第一个 weak 引用时)。当 weak 引用被销毁时,运行时会减少 weak 计数。如果递减计数仍高于零,则运行时知道至少还有一个 strongunownedweak 对该对象的引用,因此运行时知道它不应该为该对象释放边表条目. (边表条目保持分配状态,直到对象的所有strongunownedweak 引用都被销毁。)因此,当运行时销毁weak 引用时,它不必检查@ 987654345@ 计数(或strong 计数)以了解是否释放边表条目。如果在销毁最后一个 unowned(或 strong)引用之前销毁所有 weak 引用,这可以节省时间。

【讨论】:

  • 谢谢!所以通常你认为这是一个性能问题,我说对了吗?但是运行时真的需要这个吗,因为(至少每个this 源)边表保留所有引用计数器:strongweakunowned? @robmayoff
  • 我已经按照您的建议创建了一个post on Swift Forums,并将在收到答案时在此处总结讨论。
猜你喜欢
  • 1970-01-01
  • 2020-04-17
  • 2011-03-20
  • 1970-01-01
  • 2017-05-22
  • 1970-01-01
  • 2019-04-01
  • 2011-07-21
  • 2017-11-28
相关资源
最近更新 更多