Noa*_*men 2 python weak-references
python 文档提出的弱引用的用例之一是保留对大型缓存对象的引用而不增加其引用计数,从而不会阻止它们在时机成熟时被垃圾收集。
但是,垃圾收集不能保证在对象的引用计数达到零后立即发生,并且弱引用仅在 GC 收集其目标时才会失效。因此,基本上可以保留对无效对象的有效(非死)weakref - PyPy 损坏的 WeakSet 就是这种情况的一个例子。
因此,假设一个具有对抗性的垃圾收集器,是否存在弱引用为用户提供确定性且有用的行为的场景(除了终结器之外)?
它\xe2\x80\x99s实际上并不是要在引用消失后立即对对象进行垃圾收集,并在这种情况下使弱引用无效。它\xe2\x80\x99实际上只是允许当没有其他东西引用该对象时对其进行垃圾收集。
\n\n一个常见的用例是观察者模式,您可以在其中向可观察对象添加观察者(或侦听器)。这通常用于事件系统。让\xe2\x80\x99s 假设你有一个带有点击事件的按钮;当您现在使用处理程序注册该单击事件时,您需要确保正确取消注册这些处理程序,否则您将遇到内存泄漏。可观察对象将保留对其侦听器的引用,因此即使不再使用这些对象(除了作为处理程序的工作之外),这些对象也永远不会被垃圾收集。
\n\n此处使用弱引用可防止在确定是否对对象进行垃圾收集时将侦听器注册计为引用。因此,您无需显式注销事件处理程序,从而更易于使用。您可以仅使用弱引用注册处理程序,并在需要时删除侦听器。
\n\n还有其他合法的用例,维基百科有一些,但一般来说,弱引用用于防止在没有其他强引用的情况下将对象保留在内存中。但这并没有说明对象何时真正被垃圾收集。
\n