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