Dans MVVMCROSS, comme dans d'autres cadres, le choix entre l'utilisation de la référence faible et de la forte référence est crucial pour gérer la mémoire et empêcher les fuites de mémoire. Voici une explication détaillée des différences et de la façon dont elles s'appliquent dans le contexte de MVVMCROSS:
Références fortes
** Les références fortes sont le type de référence par défaut dans la plupart des langages de programmation, y compris C #. Lorsqu'un objet est fortement référencé, le collecteur des ordures ne peut pas le collecter tant que toutes les références fortes à l'objet ne sont pas supprimées. Cela signifie que tant qu'il y a au moins une référence forte à un objet, il restera en mémoire.
Dans MVVMCross, des références solides peuvent conduire à des fuites de mémoire si elles ne sont pas gérées correctement. Par exemple, si un ViewModel détient une forte référence à une vue et que la vue contient également une forte référence au ViewModel, un cycle de conservation est créé. Cela empêche les deux objets d'être collectés des ordures même lorsqu'ils ne sont plus nécessaires.
Références faibles
** Les références faibles, en revanche, permettent au collecteur des ordures de collecter l'objet référencé s'il n'y a pas de références fortes. Ceci est particulièrement utile dans les scénarios où vous souhaitez permettre à un objet d'être collecté s'il n'est plus nécessaire, mais que vous souhaitez toujours y accéder s'il est disponible.
Dans MVVMCross, l'utilisation de références faibles est encouragée à éviter de conserver les cycles entre les modèles de vue et les vues. Par exemple, au lieu de faire référence fortement à ViewModel, vous pouvez utiliser une référence faible ou un système de messagerie pour communiquer entre eux. Cela garantit que la vue peut être collectée à des ordures lorsqu'elle n'est plus nécessaire, même si le ViewModel existe toujours.
Exemple pratique dans MVVMCROSS
Considérez un scénario où un ViewModel doit informer une vue lorsque certaines données sont chargées. Une approche commune consiste à utiliser un événement dans le ViewModel auquel la vue s'abonne. Cependant, si la vue s'abonne fortement à cet événement, elle crée une forte référence du ViewModel à la vue, ce qui peut empêcher la vue de la poubelle.
Pour éviter cela, MVVMCross fournit des méthodes comme «faibleSubscribe», qui permet à la vue de s'abonner faiblement aux événements de ViewModel. De cette façon, le ViewModel ne tient pas une forte référence à la vue, empêchant les fuites de mémoire.
Lignes directrices pour l'utilisation de références faibles dans MVVMCROSS
- Utilisez des références faibles pour les vues: lorsqu'un mode de vue doit interagir avec une vue, utilisez des références faibles ou des systèmes de messagerie pour éviter de conserver les cycles.
- Évitez les références solides aux vues: assurez-vous que les modèles de vue ne contiennent pas de références solides aux vues pour permettre aux vues de collecter les ordures lorsqu'elles ne sont plus nécessaires.
- Utilisez des systèmes de messagerie: envisagez d'utiliser des systèmes de messagerie comme le `IMVXMessenger» de MVVMCross pour communiquer entre ViewModels et les vues sans créer de références solides.
En suivant ces directives, vous pouvez gérer efficacement la mémoire dans les applications MVVMCross et prévenir les problèmes communs comme les fuites de mémoire.
Citations:[1] https://stackoverflow.com/a/19379912
[2] https://forums.swift.org/t/unowned-references-have-more-overhead-than-strong-references/72765
[3] https://learn.microsoft.com/en-us/dotnet/standard/garbage-collection/weak-references
[4] https://www.reddit.com/r/swift/comments/8ifwy9/ios_mvvm_brialing_retainer_cycle_between/
[5] https://stackoverflow.com/questions/40966271/weak-reference-and-stong-reference
[6] https://langdev.stackexchange.com/questions/1351/approaches-for-implementing-weak-references
[7] https://putridparrot.com/blog/weakreferences-in-net/
[8] http://java-late.blogspot.com/2014/07/diférence-Between-StrongReference-Weakreference-Softreference-phantomreference-in-java.html