MVVMCROSS garantisce la raccolta dei rifiuti per gli abbonamenti a eventi principalmente attraverso l'uso di riferimenti deboli. Ecco una spiegazione dettagliata di come funziona:
Panoramica di MVVMcross Messenger
Il plug -in MVVMCRoss Messenger è progettato per facilitare l'aggregazione di eventi tra i componenti. Consente ai componenti di comunicare pubblicando e iscrivendosi ai messaggi. Il Messenger utilizza riferimenti deboli per gli abbonamenti a eventi, che aiutano a prevenire le perdite di memoria consentendo al collettore della spazzatura di rimuovere gli oggetti che non sono più referenziati.
Riferimenti deboli in mvvmcross
Quando ti iscrivi a un messaggio utilizzando MVVMcross Messenger, è possibile specificare se utilizzare un riferimento debole o forte. Per impostazione predefinita, MVVMCROSS utilizza riferimenti deboli (`mvxreference.weak`) per gli abbonamenti. Ciò significa che il Messenger non ha un forte riferimento al metodo di callback, consentendo al collettore della spazzatura di rimuovere l'abbonamento se l'oggetto sottoscritto non va fuori dall'ambito.
Abbonamentoe iscrizione
Gli abbonamenti possono essere gestiti utilizzando diversi metodi:
- Iscriviti: i messaggi vengono passati direttamente nel thread di pubblicazione.
- Iscriviti a MAINTHREAD: i messaggi vengono mashalizzati al thread dell'interfaccia utente principale.
- Iscriviti aThreadPoolThread: i messaggi vengono messi in coda per l'elaborazione del pool di thread.
Ogni metodo di abbonamento restituisce un `mvxsubscripriscriptionToken`, che può essere utilizzato per annullare l'iscrizione al messaggio. Tuttavia, se il token non è memorizzato, l'abbonamento può essere raccolto immediatamente.
Meccanismo di collezione di immondizia
Il meccanismo della raccolta della spazzatura in mvvmcross si basa sul "MVXSubscriptionToken" MVXSubriscription` essendo raccolta la spazzatura quando non va fuori portata. Se un token di abbonamento non è archiviato, sarà idoneo per la collezione di immondizia, che può portare all'iscrizione all'iscrizione del gestore di eventi. Questo approccio garantisce che gli oggetti non siano mantenuti in memoria inutilmente a causa di abbonamenti a eventi.
Osservazione dello stato di abbonamento
MVVMCROSS fornisce anche metodi per osservare l'attuale stato di abbonamento, come `hassubScriptionsfor" e `CountsubScriptionsfor`. Inoltre, il Messenger pubblica i messaggi "MVXSUBSUCSCRIBERCHANGEMESSAGE" ogni volta che vengono aggiunti, rimossi o scadono gli abbonamenti, consentendo ai componenti di adattare il loro comportamento in base allo stato di abbonamento attuale.
Best practice per la gestione della memoria
Per garantire un'efficace raccolta dei rifiuti e prevenire perdite di memoria:
- Utilizzare riferimenti deboli per gli abbonamenti di eventi quando possibile.
- Memorizza i token di abbonamento se è necessario gestire esplicitamente gli abbonamenti.
- annullare l'iscrizione agli eventi quando non sono più necessari, soprattutto se si utilizzano riferimenti forti.
- Evita di mantenere forti riferimenti a oggetti che dovrebbero essere raccolti dalla spazzatura, come modelli di visualizzazione o viste.
Seguendo queste pratiche e sfruttando il debole meccanismo di abbonamento di MVVMCROSS, gli sviluppatori possono aiutare a garantire che gli abbonamenti agli eventi non impediscano che gli oggetti vengano raccolti la spazzatura, mantenendo così un'efficace gestione della memoria nelle loro applicazioni.
Citazioni:[1] https://www.mvvmcross.com/documentation/plugins/messenger
[2] https://stackoverflow.com/questions/39315395/mvvmcross-best-way-to-raise-event-in-viewmodel
[3] https://stackoverflow.com/questions/12494804/helping-the-gc-in-mono-droid-using-mvvmcross
[4] https://gregshackles.com/weak-subscription-otcha-in-mvvmcross/
[5] https://github.com/mvvmcross/mvvmcross/issues/2145
[6] https://livebook.manning.com/book/xamarin-in-action/b-using-mvvm-light-instead-of-mvvmcross/v-15/
[7] https://stackoverflow.com/questions/30798429/mvvmcross-android-viewmodel-never-garbage collected
[8] https://www.mvvmcross.com/documentation/advanced/customizing-using-using-app-and-setup
[9] https://www.spicelogic.com/blog/net-event-handler-memory-deak-16