Wenn ich eine Anwendung mit nur wenigen Ereignisprozeduren registriert habe (und die Objekte, die die Ereignisse verwenden, werden nicht entfernt, bis die Anwendung geschlossen wird), muss ich mich wirklich sorgen, die Registrierung dieser Behandlungsroutinen aufzuheben? Der einzige gute Grund, den ich sehen könnte, ist, dass es einen zusätzlichen Overhead geben könnte, wenn Ereignisse ausgelöst werden, die Sie nicht unbedingt kümmern müssen (d. H. Sie haben mehrere Handler für ein Ereignis registriert). Gibt es noch einen anderen guten Grund? Jeder stieß auf größere Probleme, weil er die Ereignisse nicht abmeldete.Ist es schlecht, Ereignishandler nicht zu entfernen?
Antwort
Wenn Sie A
ein Ereignis zu veröffentlichen, und B
auf ein Ereignis abonnieren möchte (der Handler), dann ist es nur ein Problem, nicht abmelden, wenn A
viel länger als B
leben wird. Im Grunde bedeutet das Ereignisabonnement, dass A
B
immer noch sehen kann, also verhindern würde, dass es Müll gesammelt wird, und würde noch Ereignisse darauf feuern, selbst wenn Sie es vergessen haben (und vielleicht Disposed()
es).
Zum Beispiel ist dies ein Problem, wenn A
ein statisches Ereignis ist, und Ihre App läuft für eine Weile nach B
stirbt ...
Es ist wichtig, zu beachten, könnte man fragen folgend:
Wenn B viel länger lebt als A, wird B verhindern, dass A Müll gesammelt wird?
Und die Antwort darauf ist "Nein". B hat keinen Bezug zu A während des Ereignisses; A wird wie üblich gesammelt
Viele Leute scheinen zu denken, dass es nur wichtig ist, Ereignisse abzubestellen, wenn der Verleger den Abonnenten überleben wird. Ich mag diesen Ansatz nicht. Ein Ereignisteilnehmer, der sich nicht selbst vom Publisher löst, erzeugt einige unangenehme Abhängigkeiten vom Verhalten von Entitäten außerhalb des Publishers und Abonnenten. Wenn ein Verweis auf den Herausgeber länger als erwartet gehalten wird, hält dies den Abonnenten am Leben, zusammen mit allen Objekten, an denen der Abonnent eine Referenz hält. Wenn eine große Masse von abgebrochenen Objekten durch Ereignishandler miteinander verbunden ist, aber keine Live-Referenz zu einem von ihnen existiert, können alle Objekte vom Müllsammler erfasst werden. Wenn jedoch jemand irgendwo unerwartet einen Verweis auf eines der Objekte hält, kann dies verhindern, dass irgendwelche von ihnen als Müll gesammelt werden.
IMHO, es ist viel besser, proaktive entfernen Ereignishandler als sie zu verlassen und hoffe, dass alles aufgeräumt wird. Wenn man nicht sicher sein kann, dass es keine unerwarteten Verweise auf den Herausgeber geben kann, wird ein solcher Ansatz wahrscheinlich "meistens" funktionieren, aber gelegentlich Speicherlecks verursachen.
- 1. ist es schlecht Initialisierungsblocks
- 2. Kann jQuery .off() nicht entfernen, um den Ereignishandler zu entfernen
- 3. Ist es schlecht ToList zu verwenden?
- 4. UnnötigLocalBeforeReturn - warum ist es schlecht?
- 5. Ist es aus SEO-Sicht schlecht, HTML zu minimieren?
- 6. Array-Deklaration Trick: Ist es schlecht, es zu benutzen?
- 7. Es ist nicht möglich, Indizes zu entfernen
- 8. msdeploy --- Funktioniert es oder ist es schlecht?
- 9. Aktuellen Ereignishandler in JQuery entfernen?
- 10. Ist es möglich, alle Ereignishandler in Dojo zu trennen?
- 11. ist es schlecht viele Divs auf einer Seite zu verwenden?
- 12. Ist es schlecht, Einstellungen in einer Klasse zu programmieren?
- 13. Ist es schlecht, Base62 eine JavaScript-Datei zu kodieren?
- 14. Ist es "Fremdschlüsselredundanz" in einer Datenbank schlecht?
- 15. jQuery - ist es schlecht, mehrere $ (Dokument) .ready (function() {}) zu haben;
- 16. Ist es schlecht, glTexParameteri() während der Renderzeit zu setzen?
- 17. Ist es schlecht, Operationen in # {this} zu setzen?
- 18. Ist es schlecht, HTML in einer PHP-Klasse zu verwenden?
- 19. Ist es schlecht, MinGW und Msys2 installiert zu haben?
- 20. Warum ist es schlecht, einen lokalen Funktor zu haben?
- 21. Ist es schlecht, ein Webbenutzer-Steuerelement als Zustandsmaschine zu modellieren?
- 22. Ist es schlecht, wenn Aussagen ohne andere Aussagen zu haben?
- 23. Ist es schlecht, denselben Logger für verschiedene Anwendungen zu verwenden
- 24. Ist es schlecht, _id in MongoDB in Ganzzahl zu ändern?
- 25. Was ist "String Bashing" und warum ist es schlecht?
- 26. ImageMagick: Ist es möglich, "Schnittmarken" zu entfernen?
- 27. Wie alle Click-Ereignishandler in Jquery zu entfernen sind
- 28. Jquery Entfernen Sie alle Ereignishandler Inside Element
- 29. Wie schlecht ist eval() zu lesen Funktionsparameter
- 30. Warum ist seq schlecht?
Dies ist besonders schlecht, wenn B Ressourcen schwer ist ... –
Great insight Marc. Handler für statische Ereignisse sind wirklich berüchtigt, wenn sie nicht beachtet werden, während sie den Teilnehmer entsorgen. – TheVillageIdiot
Ich weiß, das ist ein alter Post und ich weiß nicht, ob es jemals gelesen werden wird, aber wenn B viel länger lebt als A, wird B verhindern, dass Müll gesammelt wird? –