Home Arrow Icon Knowledge base Arrow Icon Global Arrow Icon En quoi le modèle d'événement faible diffère-t-il des événements classiques de MVVMCross


En quoi le modèle d'événement faible diffère-t-il des événements classiques de MVVMCross


Le modèle d'événement faible et les événements classiques dans MVVMCross (ou tout cadre .NET) servent des objectifs différents et ont des implémentations distinctes, visant principalement à gérer les fuites de mémoire et les durées de vie des objets.

Événements classiques

Les événements classiques de .NET sont basés sur de fortes références. Lorsqu'un objet s'abonne à un événement d'un autre objet, une forte référence est créée à partir de la source d'événement à l'abonné. Cela signifie que tant que la source d'événements détient une référence à l'abonné, l'abonné ne peut pas être collecté à la poubelle, même s'il n'est plus nécessaire ou référencé ailleurs dans l'application. Cela peut entraîner des fuites de mémoire si l'abonné n'est pas explicitement non inscrit à l'événement lorsqu'il n'est plus nécessaire.

Dans MVVMCross, les événements classiques peuvent être utilisés pour la communication entre les anciens de vue et les vues, mais ils nécessitent une gestion minutieuse pour éviter les fuites de mémoire. Par exemple, si un ViewModel expose un événement et qu'une vue lui abonne, le ViewModel tiendra une forte référence à la vue, empêchant la collecte des ordures jusqu'à ce que l'abonnement soit explicitement supprimé.

Modèle d'événement faible

Le modèle d'événement faible est conçu pour empêcher les fuites de mémoire en utilisant des références faibles au lieu de fortes. Lorsqu'un abonné utilise un modèle d'événement faible pour s'abonner à un événement, la source d'événement détient une faible référence à l'abonné. Cela permet à l'abonné d'être collecté des ordures s'il n'est plus référencé ailleurs dans l'application, même si elle n'a pas explicitement désabonné l'événement.

Dans MVVMCROSS, l'utilisation d'événements faibles peut aider à maintenir une architecture propre en veillant à ce que les modèles de vue n'ont pas de références solides aux vues. Ceci est particulièrement important dans les applications mobiles où la gestion de la mémoire est essentielle. MVVMCross fournit des extensions comme «faibleSubscribe» pour faciliter l'utilisation d'événements faibles, permettant aux développeurs de s'abonner à des événements sans créer de références fortes qui pourraient conduire à des fuites de mémoire.

Mise en œuvre et avantages sociaux

La mise en œuvre d'événements faibles implique généralement la création d'un mécanisme personnalisé pour gérer les abonnements à l'aide d'objets «faibles». Cette approche garantit que les abonnés peuvent être collectés des ordures s'ils ne sont plus nécessaires, ce qui réduit le risque de fuites de mémoire. Cependant, il introduit également une complexité supplémentaire et une légère surcharge de performances en raison de la nécessité de vérifier si les abonnés sont toujours en vie avant d'appeler leurs gestionnaires d'événements.

inconvénients et considérations

Bien que le modèle d'événement faible soit bénéfique pour prévenir les fuites de mémoire, il présente certains inconvénients. Il peut être plus complexe à mettre en œuvre que les événements classiques, et il existe un risque d'objets d'abonnés "zombies" qui ne sont plus utilisés mais qui n'ont pas encore été collectés à des ordures. Si un événement est augmenté et que le gestionnaire d'un abonné Zombie est exécuté, il peut conduire à un comportement ou à des erreurs inattendu.

En résumé, le modèle d'événement faible dans MVVMCross diffère des événements classiques en utilisant des références faibles pour empêcher les fuites de mémoire et permettre aux abonnés d'être collectés plus facilement. Bien qu'il offre des avantages importants en termes de gestion de la mémoire, il nécessite une mise en œuvre minutieuse et une prise en compte des inconvénients potentiels.

Citations:
[1] https://stackoverflow.com/a/19379912
[2] http://stackoverflow.com/questions/30848118/capturing-the-onexit-event-in-wpf-with-mvvmcross/31784453
[3] https://www.reactiveui.net/vs/mvvmcross
[4] https://mustafacanyucel.com/blog/blog-22.html
[5] https://ladimolnar.com/2015/09/14/the-weak-event-pattern-is-dangère/
[6] https://www.mvvmcross.com/mvvmcross-6.0.0-release/
[7] https://yanxiaodi.gitbook.io/xamarin-mvvmcross-handbook/using-mvvmcross-to-create-your-first-xamarin-app/navigation/respond-the-events-from-ditent-controls-in-the-listview
[8] https://www.devleader.ca/2024/02/14/weak-events-in-c-how-to-avoid-nasty-memory-leaks
[9] https://learn.microsoft.com/en-us/dotnet/desktop/wpf/events/weak-event-patterns?view=netdesktop-9.0
[10] https://www.mvvmcross.com/documentation/fundamentals/navigation
[11] https://www.mvvmcross.com/documentation/fundamentals/viewmodel-lifecycle
[12] https://stackoverflow.com/questions/13788787/when-to-use-weak-events