Schwache Referenzen sind alles über Garbage Collection. Ein Standard Objekt wird nicht "verschwinden", bis alle Verweise darauf getrennt sind. Dies bedeutet, dass alle Verweise, die Ihre verschiedenen Objekte darauf haben, entfernt werden müssen, bevor die Garbage Collection es als Müll betrachtet.
Mit einer schwachen Referenz, nur weil Ihr Objekt von anderen Objekten referenziert wird, bedeutet nicht unbedingt, dass es nicht Müll ist. Es kann immer noch von GC abgeholt und aus dem Speicher entfernt werden.
Ein Beispiel: Wenn ich eine Menge Foo-Objekte in meiner Anwendung habe, möchte ich vielleicht ein Set verwenden, um alle Foo's, die ich habe, zentral zu verwalten. Aber wenn andere Teile meiner Anwendung ein Foo-Objekt entfernen, indem Sie alle Verweise darauf löschen, möchte ich nicht die verbleibende Referenz, die mein Set für dieses Objekt enthält, um zu verhindern, dass es Garbage Collected wird! Wirklich, ich will nur, dass es von meinem Set verschwindet. Hier würden Sie etwas wie ein schwaches Set verwenden (Java verfügt über eine WeakHashMap), das schwache Referenzen auf seine Member anstelle von "starken" Referenzen verwendet.
Wenn Ihre Objekte nicht zu Garbage Collected gesammelt werden, wenn Sie möchten, haben Sie einen Fehler in Ihrer Buchhaltung, etwas hält immer noch eine Referenz, die Sie vergessen zu entfernen. Die Verwendung schwacher Referenzen kann den Schmerz einer solchen Buchführung mildern, da Sie sich keine Sorgen darüber machen müssen, ob ein Objekt "lebendig" und nicht müllbeseitigt bleibt, aber Sie haben nicht, um sie zu verwenden.
Weitere Beispiele für Verwendungen für schwache Referenzen finden Sie unter http://stackoverflow.com/questions/1434156/other-uses-of-weak-references –
Soweit ich weiß, ist die einzige Gefahr mit WR, dass Sie wirklich wollen eine * starke * Referenz. Wenn Ihre Objekte zu verschwinden beginnen, wenn Sie nicht möchten, dass Sie zu weit gegangen sind;) –
Sie müssen wissen, wann sie und wie verwendet werden, und in einigen Fällen kommt es zu ähnlichen Problemen wie beim Multithreading mit Locking on Daten. Zum Beispiel ist es einfach falsch zu einem (.NET-Beispiel): 'if (x.IsAlive) {x.Target.ToString(); } 'weil das Objekt in der Zwischenzeit möglicherweise gesammelt wurde. Sie müssen zuerst eine starke Referenz erfassen und dann überprüfen, ob sie noch lebt: 'Objekt t = x.Target; if (t! = null) {t.ToString(); }, denn sobald Sie eine starke Referenz auf das Objekt wiedererlangt haben, wird es nicht gesammelt. – Lucero