Home Arrow Icon Knowledge base Arrow Icon Global Arrow Icon Wie sorgt Mvvmcross für Müllsammlung für Veranstaltungsabonnements?


Wie sorgt Mvvmcross für Müllsammlung für Veranstaltungsabonnements?


MVVMCROSS stellt die Müllsammlung für Ereignisabonnements hauptsächlich durch die Verwendung schwacher Referenzen sicher. Hier ist eine detaillierte Erklärung, wie es funktioniert:

Übersicht über MVVMCross Messenger

Das MVVMCross Messenger -Plugin ist entwickelt, um die Ereignisaggregation zwischen den Komponenten zu erleichtern. Es ermöglicht Komponenten, durch Veröffentlichen und Abonnieren von Nachrichten zu kommunizieren. Der Messenger verwendet schwache Referenzen für Ereignisabonnements, die dazu beitragen, Speicherlecks zu verhindern, indem der Garbage Collector Objekte entfernen kann, auf die nicht mehr verwiesen werden.

Schwache Referenzen in mvvmcross

Wenn Sie eine Nachricht mit dem MVVMCross -Messenger abonnieren, können Sie angeben, ob eine schwache oder starke Referenz verwendet werden soll. Standardmäßig verwendet Mvvmcross schwache Referenzen (`mvxReference.weak`) für Abonnements. Dies bedeutet, dass der Messenger keinen starken Hinweis auf die Rückrufmethode hat, sodass der Müllsammler das Abonnement entfernen kann, wenn das abonnierte Objekt aus dem Umfang ausgeht.

Abonnement und Abschlussschreibung

Abonnements können mit verschiedenen Methoden verwaltet werden:
- Abonnieren: Nachrichten werden direkt auf den Verlagsthread übergeben.
.
.

Jede Abonnementmethode gibt einen "MVXSubScriptionToken" zurück, mit dem sich die Nachricht abmelden kann. Wenn das Token jedoch nicht gespeichert ist, kann das Abonnement sofort Müll erhoben.

Müllsammlermechanismus

Der Müllsammlermechanismus in mvvmcross basiert auf dem "mvxsubscriptionToken", der Müll gesammelt wird, wenn er aus dem Zielfernrohr ausgeht. Wenn ein Abonnement -Token nicht gespeichert wird, kann es für die Müllsammlung berechtigt sein, was zur Abzügigkeit des Event -Handlers führen kann. Dieser Ansatz stellt sicher, dass Objekte aufgrund von Ereignisabonnements nicht unnötig im Speicher gehalten werden.

Abonnementstatus beobachten

MVVMCross bietet auch Methoden zur Beobachtung des aktuellen Abonnementstatus wie "hassubScriptionsfor" und "countSubScriptionsfor". Darüber hinaus veröffentlicht der Messenger "mvxsubscriberChangemessage" Nachrichten, wenn Abonnements hinzugefügt, entfernt, entfernt oder ausfallen, damit Komponenten ihr Verhalten anhand des aktuellen Abonnementzustands anpassen können.

Best Practices für die Speicherverwaltung

Um eine effektive Müllsammlung zu gewährleisten und Speicherlecks zu verhindern:
- Verwenden Sie nach Möglichkeit schwache Referenzen für Ereignisabonnements.
- Speichern Sie Abonnement -Token, wenn Sie Abonnements explizit verwalten müssen.
- Abbestellen von Ereignissen, wenn sie nicht mehr benötigt werden, insbesondere wenn sie starke Referenzen verwenden.
- Vermeiden Sie starke Verweise auf Objekte, die Müll gesammelt werden sollten, wie z. B. Ansichtsmodelle oder Ansichten.

Durch die Befolgung dieser Praktiken und der Nutzung des schwachen Abonnementmechanismus von MVVMCross können Entwickler dazu beitragen, dass Ereignisabonnements nicht verhindern, dass Objekte die Müll gesammelt haben, wodurch ein effizientes Speichermanagement in ihren Anwendungen aufrechterhalten wird.

Zitate:
[1] https://www.mvmcross.com/documentation/plugins/messenger
[2] https://stackoverflow.com/questions/39315395/mvmcross-best-way-to-raise-event-in-viewmodel
[3] https://stackoverflow.com/questions/12494804/helping-the-gc-in-mono-droid-using-mvmcross
[4] https://gregshackles.com/weak-subscription-gotcha-in-mvmcross/
[5] https://github.com/mvvmcross/mvmcross/issues/2145
[6] https://livebook.manning.com/book/xamarin-in-action/b-using-mvm-light-instead-of-mvmcross/v-15/
[7] https://stackoverflow.com/questions/30798429/mvvmcross-android-viewmodel-never-mbage-collected
[8] https://www.mvvmcross.com/documentation/advanced/customizing-using-app-setup
[9] https://www.spicelogic.com/blog/net-event-handler-memory-leak-16