我知道弱引用是记忆潜在大量数据的好选择,而维基百科关于弱引用的文章只列出了“跟踪应用程序中引用的当前变量”和“弱引用的另一种用法是书面的”一个缓存”。
还有哪些其他情况(比“缓存结果”更具体)使用弱引用是 A Good Idea TM?
我知道弱引用是记忆潜在大量数据的好选择,而维基百科关于弱引用的文章只列出了“跟踪应用程序中引用的当前变量”和“弱引用的另一种用法是书面的”一个缓存”。
还有哪些其他情况(比“缓存结果”更具体)使用弱引用是 A Good Idea TM?
弱引用的主要正确用途是识别其重要性源于对它们的强引用的存在。两种最常见的情况是:
一个对象持有对某事物的引用不是因为它“关心”所讨论的对象,而是因为确实关心该对象的其他实体可能希望它对它做某事。如果过了一段时间没有人再关心这个对象,那么其他实体就没有理由继续代表“所有关心它的实体”来操纵它。
保存对同一个不可变对象的许多引用的内存成本可能远低于保存对许多相同对象的引用的内存成本,并且比较对同一对象的引用可能比比较相同对象要快得多。创建一个不可变对象、放弃它、收集它以及创建一个相同对象的内存成本与创建一个对象并随后返回对它的第二个引用的成本基本相同。返回对无论如何都必须保留的现有对象的引用是一个巨大的胜利;返回对符合收集条件但尚未收集的对象的引用可能会也可能不会成功(通常是轻微的胜利,但在分代 GC 中有时会稍微损害性能);在许多情况下,后者的好处不足以证明使对象的存活时间比其他情况所需的时间更长。
在 Flex 中,使用弱引用来避免内存泄漏。
如果事件处理程序是短期实例对象的成员,则将处理程序作为强引用传递给将延长寿命的对象可能会使短期实例不必要地保持活动状态。
在 Python 中,垃圾收集器使用引用计数来决定何时“销毁”或以其他方式释放对象。正常的循环引用可能导致对象永远不会被垃圾回收,因为它们的引用计数分别保持在 1 或更高;但是使用弱引用将允许两个/所有对象在超出范围时被正确清理。