Home Arrow Icon Knowledge base Arrow Icon Global Arrow Icon ¿Cuáles son las diferencias entre el uso de la referencia débil y la fuerza fuerte en mvvmcross


¿Cuáles son las diferencias entre el uso de la referencia débil y la fuerza fuerte en mvvmcross


En MVVMCross, como en otros marcos, la elección entre el uso de la referencia débil y la fuerza fuerte es crucial para administrar la memoria y prevenir las fugas de memoria. Aquí hay una explicación detallada de las diferencias y cómo se aplican en el contexto de MVVMCross:

Fuertes referencias

** Las referencias fuertes son el tipo de referencia predeterminado en la mayoría de los lenguajes de programación, incluida C#. Cuando se hace referencia a un objeto fuertemente, el recolector de basura no puede recolectarlo hasta que se eliminen todas las referencias fuertes al objeto. Esto significa que mientras haya al menos una fuerte referencia a un objeto, permanecerá en la memoria.

En MVVMCross, las referencias fuertes pueden conducir a fugas de memoria si no se administran correctamente. Por ejemplo, si un modelo ViewModel mantiene una fuerte referencia a una vista, y la vista también tiene una fuerte referencia a ViewModel, se crea un ciclo de retención. Esto evita que ambos objetos sean recolectados de basura incluso cuando ya no son necesarios.

Referencias débiles

** Referencias débiles, por otro lado, permiten que el recolector de basura recolecte el objeto referenciado si no existen referencias fuertes. Esto es particularmente útil en escenarios en los que desea permitir que un objeto se recolecte la basura si ya no es necesario, pero aún desea acceder a él si está disponible.

En MVVMCross, se alienta al uso de referencias débiles para evitar los ciclos de retención entre modelos de vista y vistas. Por ejemplo, en lugar de tener una vista de ViewModel referencia firmemente a una vista, puede usar una referencia débil o un sistema de mensajería para comunicarse entre ellos. Esto asegura que la vista se pueda recolectar la basura cuando ya no es necesaria, incluso si el Modelo ViewS todavía existe.

Ejemplo práctico en mvvmcross

Considere un escenario en el que un Modelo ViewModel necesita notificar una vista cuando se cargan algunos datos. Un enfoque común es usar un evento en el modelado ViewModel al que se suscribe la vista. Sin embargo, si la vista se suscribe fuertemente a este evento, crea una sólida referencia desde el modelado ViewModelo a la vista, lo que puede evitar que la vista sea recolectada de basura.

Para evitar esto, MVVMCross proporciona métodos como 'WeakSubscribe`, que permite que la vista se suscriba a los eventos del Modelo ViewModel débilmente. De esta manera, el Modelo ViewModel no tiene una fuerte referencia a la vista, evitando las fugas de memoria.

Directrices para usar referencias débiles en MVVMCross

- Use referencias débiles para las vistas: cuando un model de visión necesita interactuar con una vista, use referencias débiles o sistemas de mensajería para evitar los ciclos de retención.
- Evite las referencias fuertes a las vistas: asegúrese de que los modelos de vista no tengan referencias fuertes a las vistas para permitir que las vistas sean recolectadas cuando ya no se necesitan.
- Use sistemas de mensajería: considere usar sistemas de mensajería como el `IMVXMessenger` de MVVMCross para comunicarse entre ViewModels y Vistas sin crear referencias fuertes.

Siguiendo estas pautas, puede administrar de manera efectiva la memoria en aplicaciones MVVMCross y prevenir problemas comunes como fugas de memoria.

Citas:
[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_breaking_etainer_cycle_between/
[5] https://stackoverflow.com/questions/40966271/weak-reference-and strong-reference
[6] https://langdev.stackexchange.com/questions/1351/approaches-for-implementing-weak-references
[7] https://putridparrot.com/blog/weakreferences-in-net/
[8] http://java-latte.blogspot.com/2014/07/difference-between strongreference-weakreference-softreference-phantomreference-in-java.html