【问题标题】: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,制作额外的有什么意义?
【问题讨论】:
标签:
ios
objective-c
swift
【解决方案1】:
unowned 计数存储在对象的直接分配存储中。当 unowned 引用被销毁时,运行时会减少 unowned 计数。如果递减的计数仍然高于零,则运行时知道至少还有一个strong 或unowned 对该对象的引用,因此运行时知道它不应该释放对象的存储空间。 (存储一直分配到对象的所有strong 和unowned 引用被销毁。)因此,当运行时销毁unowned 引用时,它不必检查strong 计数来知道是否释放存储空间。如果在最后一个 strong 引用被销毁之前销毁所有 unowned 引用,这可以节省时间。
weak 计数存储在对象的“side table”条目中,直到需要时才会分配(通常是在创建对对象的第一个 weak 引用时)。当 weak 引用被销毁时,运行时会减少 weak 计数。如果递减计数仍高于零,则运行时知道至少还有一个 strong 或 unowned 或 weak 对该对象的引用,因此运行时知道它不应该为该对象释放边表条目. (边表条目保持分配状态,直到对象的所有strong、unowned 和weak 引用都被销毁。)因此,当运行时销毁weak 引用时,它不必检查@ 987654345@ 计数(或strong 计数)以了解是否释放边表条目。如果在销毁最后一个 unowned(或 strong)引用之前销毁所有 weak 引用,这可以节省时间。
【讨论】:
-
谢谢!所以通常你认为这是一个性能问题,我说对了吗?但是运行时真的需要这个吗,因为(至少每个this 源)边表保留所有引用计数器:strong、weak 和unowned? @robmayoff
-
我已经按照您的建议创建了一个post on Swift Forums,并将在收到答案时在此处总结讨论。