Home Arrow Icon Knowledge base Arrow Icon Global Arrow Icon W jaki sposób MVVMCROSS zapewnia zbieranie śmieci dla subskrypcji zdarzeń


W jaki sposób MVVMCROSS zapewnia zbieranie śmieci dla subskrypcji zdarzeń


MVVMCROSS zapewnia zbieranie śmieci dla subskrypcji zdarzeń przede wszystkim poprzez zastosowanie słabych odniesień. Oto szczegółowe wyjaśnienie, jak to działa:

Przegląd MVVMCROSS Messenger

Wtyczka MVVMcross Messenger została zaprojektowana w celu ułatwienia agregacji zdarzeń między komponentami. Umożliwia komunikację komponentów poprzez publikowanie i subskrypcję wiadomości. Wysłannik używa słabych odniesień do subskrypcji zdarzeń, co pomaga zapobiegać wyciekom pamięci, umożliwiając poborcy śmieci usuwania obiektów, do których nie są już odwoływane.

słabe odniesienia w mvvmcross

Gdy subskrybujesz wiadomość za pomocą komunikatora MVVMCROSS, możesz określić, czy użyć słabego czy silnego odniesienia. Domyślnie Mvvmcross używa słabych odniesień (`mvxReference.weak`) dla subskrypcji. Oznacza to, że Wysłannik nie ma silnego odniesienia do metody wywołania zwrotnego, umożliwiając poborcy śmieci usunięcie subskrypcji, jeśli obiekt, który subskrybował, nie ma zasięgu.

Subskrypcja i bez subskrypcji

Subskrypcje można zarządzać za pomocą kilku metod:
- Subskrybuj: Wiadomości są przekazywane bezpośrednio w wątku wydawniczym.
- SubcribiseonMainThread: Wiadomości są wysyłane do głównego wątku interfejsu użytkownika.
- SubskrypcjaThreadPoolThread: Wiadomości są w kolejce do przetwarzania puli wątków.

Każda metoda subskrypcji zwraca „MvxSubScriptionToken`, który można użyć do rezygnacji z wiadomości z wiadomości. Jeśli jednak token nie jest przechowywany, subskrypcję może być pobrana natychmiast.

Mechanizm zbierania śmieci

Mechanizm zbierania śmieci w MVVMCROSS opowiada się na śmieciach „MvxSubScriptionToken”, gdy nie ma zasięgu. Jeśli token subskrypcji nie zostanie przechowywany, będzie kwalifikowany do zbierania śmieci, co może prowadzić do niezgłoszenia obsługi zdarzenia. Takie podejście zapewnia, że ​​obiekty nie są przechowywane w pamięci niepotrzebnie z powodu subskrypcji zdarzeń.

obserwowanie statusu subskrypcji

MVVMCROSS zapewnia również metody obserwowania obecnego statusu subskrypcji, takich jak „HassubScriptionSfor” i „crainSubScriptionsfor”. Ponadto komunikat Messenger publikuje komunikaty MVXSUBSCRIBERCHANGEMESAGESAGE, za każdym razem, gdy subskrypcje są dodawane, usuwane lub wygasające, umożliwiając komponentom dostosowanie ich zachowania w oparciu o obecny stan subskrypcji.

Najlepsze praktyki zarządzania pamięcią

Aby zapewnić skuteczną kolekcję śmieci i zapobiec wyciekom pamięci:
- W miarę możliwości używaj słabych odniesień do subskrypcji zdarzeń.
- Przechowuj tokeny subskrypcyjne, jeśli chcesz jawnie zarządzać subskrypcjami.
- Wyłączanie się z wydarzeń, gdy nie są one już potrzebne, szczególnie jeśli używasz silnych referencji.
- Unikaj przechowywania silnych odniesień do obiektów, które powinny być zebrane śmieci, takie jak modele widoku lub widoki.

Postępując zgodnie z tymi praktykami i wykorzystując słaby mechanizm subskrypcji MVVMCROSS, programiści mogą pomóc w upewnieniu się, że subskrypcje zdarzeń nie zapobiegają gromadzeniu śmieci obiektów, utrzymując w ten sposób skuteczne zarządzanie pamięcią w ich zastosowaniach.

Cytaty:
[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://regshacles.com/weak-subscription-gotcha-in-mvvmcross/
[5] https://github.com/mvvmcross/mvvmcross/issues/2145
[6] https://livebook.manning.com/book/xamarin-in-action/b-using-mvvm-light-instead-mvvmcross/v-15/
[7] https://stackoverflow.com/questions/30798429/mvvmcross-android-viewmodel-never-garbage-colled
[8] https://www.mvvmcross.com/documentation/advanced/customizing-using-app-andetup
[9] https://www.spicelogic.com/blog/net-event handler-memory-leak-16