Home Arrow Icon Knowledge base Arrow Icon Global Arrow Icon Comment MVVMCross assure-t-il la collecte des ordures pour les abonnements à l'événement


Comment MVVMCross assure-t-il la collecte des ordures pour les abonnements à l'événement


MVVMCross assure la collecte des ordures pour les abonnements à des événements principalement grâce à l'utilisation de références faibles. Voici une explication détaillée de son fonctionnement:

Aperçu de MVVMCross Messenger

Le plugin MVVMCross Messenger est conçu pour faciliter l'agrégation d'événements entre les composants. Il permet aux composants de communiquer en publiant et en abonnement aux messages. Le messager utilise des références faibles pour les abonnements à l'événement, ce qui aide à prévenir les fuites de mémoire en permettant au collecteur des ordures de supprimer des objets qui ne sont plus référencés.

Références faibles dans MVVMCross

Lorsque vous vous abonnez à un message à l'aide du MVVMCross Messenger, vous pouvez spécifier si vous devez utiliser une référence faible ou forte. Par défaut, MVVMCross utilise des références faibles (`mvxReference.weak`) pour les abonnements. Cela signifie que le messager ne retient pas une forte référence à la méthode de rappel, permettant au collecteur des ordures de supprimer l'abonnement si l'objet abonné est hors de portée.

abonnement et désabonnement

Les abonnements peuvent être gérés à l'aide de plusieurs méthodes:
- Abonnez-vous: les messages sont transmis directement sur le fil de publication.
- AbribusonMainThread: les messages sont rassemblés au fil d'interface utilisateur principal.
- abonceonThreadPoolthread: les messages sont en file d'attente pour le traitement du pool de threads.

Chaque méthode d'abonnement renvoie un `MvxSubScriptionToken», qui peut être utilisé pour se désabonner du message. Cependant, si le jeton n'est pas stocké, l'abonnement peut être collecté immédiatement.

Mécanisme de collecte des ordures

Le mécanisme de collecte des ordures dans MVVMCross repose sur le «MvxSubscriptionToken» collecté lorsqu'il sort de la portée. Si un jeton d'abonnement n'est pas stocké, il sera éligible à la collecte des ordures, ce qui peut conduire à la non-publication du gestionnaire d'événements. Cette approche garantit que les objets ne sont pas conservés inutilement en raison des abonnements à l'événement.

Statut d'abonnement à l'observation

MVVMCROSS fournit également des méthodes pour observer l'état de l'abonnement actuel, tel que «HassubScriptionsFor» et «CountSubscriptionsFor». De plus, le Messenger publie des messages «MVXSUBSCRIBERCHANGEMESSAGE» chaque fois que des abonnements sont ajoutés, supprimés ou expirés, permettant aux composants d'adapter leur comportement en fonction de l'état d'abonnement actuel.

meilleures pratiques pour la gestion de la mémoire

Pour assurer une collecte efficace des ordures et empêcher les fuites de mémoire:
- Utilisez des références faibles pour les abonnements d'événements chaque fois que possible.
- Stockez les jetons d'abonnement si vous devez gérer explicitement les abonnements.
- Se désinscrire des événements lorsqu'ils ne sont plus nécessaires, surtout si vous utilisez de fortes références.
- Évitez de garder de fortes références aux objets qui doivent être collectés à la poubelle, tels que des modèles de vue ou des vues.

En suivant ces pratiques et en tirant parti du faible mécanisme d'abonnement de MVVMCROSS, les développeurs peuvent aider à garantir que les abonnements à l'événement n'empêchent pas les objets d'être collectés à la poubelle, conservant ainsi une gestion efficace de la mémoire dans leurs applications.

Citations:
[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-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-of-mvvmcross/v-15/
[7] https://stackoverflow.com/questions/30798429/mvvmcross-android-viewmodel-never-garbage collecté
[8] https://www.mvvmcross.com/documentation/advanced/custumising-using-app-and-setup
[9] https://www.spicelogic.com/blog/net-event-handler-memory-leak-16