MVVMCross asegura la recolección de basura para las suscripciones de eventos principalmente mediante el uso de referencias débiles. Aquí hay una explicación detallada de cómo funciona:
Descripción general de MVVMCross Messenger
El complemento MVVMCross Messenger está diseñado para facilitar la agregación de eventos entre componentes. Permite que los componentes se comuniquen publicando y suscribiéndose a mensajes. El mensajero utiliza referencias débiles para suscripciones de eventos, lo que ayuda a prevenir fugas de memoria al permitir que el recolector de basura elimine los objetos a los que ya no se hace referencia.
Referencias débiles en mvvmcross
Cuando se suscribe a un mensaje utilizando el mensajero MVVMCross, puede especificar si usa una referencia débil o fuerte. Por defecto, MVVMCross usa referencias débiles (`MVXREference.weak`) para suscripciones. Esto significa que el mensajero no tiene una fuerte referencia al método de devolución de llamada, lo que permite que el recolector de basura elimine la suscripción si el objeto que suscrito sale de alcance.
suscripción y falta de suscripción
Las suscripciones se pueden administrar utilizando varios métodos:
- Suscribir: los mensajes se pasan directamente en el hilo de publicación.
- SuscríbeteMainThread: los mensajes se someten al hilo de la interfaz de usuario principal.
- SuscríbeteeNthreadPoolThread: los mensajes están en cola para el procesamiento del grupo de subprocesos.
Cada método de suscripción devuelve un `MVXSubScriptionToken`, que puede usarse para darse de baja del mensaje. Sin embargo, si el token no se almacena, la suscripción puede ser basura recolectada de inmediato.
Mecanismo de recolección de basura
El mecanismo de recolección de basura en MVVMCross se basa en el `mvxsubscriptionToken` que se recoge la basura cuando sale del alcance. Si no se almacena un token de suscripción, será elegible para la recolección de basura, lo que puede provocar la suscripción del controlador de eventos. Este enfoque asegura que los objetos no se mantengan en la memoria innecesariamente debido a las suscripciones de eventos.
Observar el estado de suscripción
MVVMCross también proporciona métodos para observar el estado de suscripción actual, como `Hassubscriptions para 'y` CountSubscriptions para'. Además, el Messenger publica mensajes `MVXSubsCriberChangeMessage` siempre que se agregan, eliminan o expire las suscripciones, lo que permite que los componentes adapten su comportamiento en función del estado de suscripción actual.
Las mejores prácticas para la gestión de la memoria
Para garantizar una recolección de basura efectiva y evitar fugas de memoria:
- Use referencias débiles para suscripciones de eventos siempre que sea posible.
- Almacene los tokens de suscripción si necesita administrar suscripciones explícitamente.
- Den suscribir a los eventos cuando ya no se necesitan, especialmente si usan referencias fuertes.
- Evite mantener referencias fuertes a objetos que deben recolectarse la basura, como modelos o vistas de vista.
Siguiendo estas prácticas y aprovechando el mecanismo de suscripción débil de MVVMCross, los desarrolladores pueden ayudar a garantizar que las suscripciones de eventos no eviten que los objetos sean recolectados de basura, manteniendo así una gestión de memoria eficiente en sus aplicaciones.
Citas:[1] https://www.mvvmcross.com/documentation/plugins/messenger
[2] https://stackoverflow.com/questions/39315395/mvvmcross-best-way-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-gotta-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-arbage-colected
[8] https://www.mvvmcross.com/documentation/advanced/customizing-using-app-and-setup
[9] https://www.spicelogic.com/blog/net-event-handler-memory-leak-16