我知道弱引用是记忆化潜在大数据集的好选择,维基百科关于弱引用的文章仅列出“跟踪应用程序中当前被引用的变量”和“另一种使用弱引用的方法是编写缓存”的陈述。除了“缓存结果”之外,使用弱引用的其他情况是哪些(更具体)?
弱引用的主要正确用法是识别那些重要性源自强引用存在的东西。最常见的两种情况是:1. 一个对象持有对某个东西的引用,不是因为它关心这个对象本身,而是因为其他关心该对象的实体可能希望使用它做一些事情。如果一段时间后没有人再关心这个对象了,就没有理由让其他实体继续代表“所有关心它的实体”操纵它。2. 持有对同一个不可变对象的多个引用的内存成本可能比持有对许多相同对象的引用的内存成本低得多,并且比较对同一对象的引用可能比比较相同对象快得多。创建一个不可变对象,然后放弃它,使其被收集,并创建一个相同的对象的内存成本与创建一个对象并稍后返回第二个引用的成本基本相同。返回对现有对象的引用,这个对象必须保留,是一个大胜利;返回对一个可回收但尚未被回收的对象的引用可能是一个胜利(通常是一个轻微的胜利),但在分代 GC 中有时会稍微降低性能;在许多情况下,后一种好处不足以证明需要将对象保持活动状态的时间比必要时间更长。
在Python中,垃圾回收器使用引用计数来决定何时“销毁”或释放对象。正常的循环引用可能会导致对象永远不会被垃圾回收,因为它们的引用计数分别保持在1或更高;但是使用弱引用将允许两个/所有对象在超出范围时得到适当的清理。