Home Arrow Icon Knowledge base Arrow Icon Global Arrow Icon Каковы различия между использованием ShideReference и сильной стороной в MVVMcross


Каковы различия между использованием ShideReference и сильной стороной в MVVMcross


В MVVMcross, как и в других структурах, выбор между использованием ShideReference и сильным версией имеет решающее значение для управления памятью и предотвращения утечек памяти. Вот подробное объяснение различий и того, как они применяются в контексте MVVMcross:

Сильные ссылки

** Сильные ссылки являются типом ссылки по умолчанию на большинстве языков программирования, включая C#. Когда на объект есть ссылка, сборщик мусора не может собирать его, пока все прочные ссылки на объект не будут удалены. Это означает, что до тех пор, пока существует хотя бы одна сильная ссылка на объект, он останется в памяти.

В MVVMcross сильные ссылки могут привести к утечкам памяти, если не управляются должным образом. Например, если ViewModel содержит прочную ссылку на представление, и представление также содержит сильную ссылку на ViewModel, создается цикл удержания. Это предотвращает получение мусора, даже если они больше не нужны.

Слабые ссылки

** С другой стороны, слабые ссылки позволяют коллекционеру мусора собирать ссылочный объект, если не существует сильных ссылок. Это особенно полезно в сценариях, когда вы хотите позволить объекту собираться мусор, если он больше не нужен, но все же хотите получить к нему доступ, если он оказался доступным.

В MVVMcross используется слабые ссылки, чтобы избежать удержания циклов между просмотров и взглядами. Например, вместо того, чтобы иметь просмотр модели, решительно ссылаясь на представление, вы можете использовать слабую ссылку или систему обмена сообщениями для общения между ними. Это гарантирует, что представление может быть собрано мусором, когда он больше не нужен, даже если ViewModel все еще существует.

Практический пример в MVVMcross

Рассмотрим сценарий, в котором ViewModel должна уведомить представление при загрузке некоторых данных. Общим подходом является использование события в ViewModel, на которое подписывается представление. Однако, если представление тесно подписывается на это событие, оно создает сильную ссылку от ViewModel обратно на представление, что может помешать собранному мусору.

Чтобы избежать этого, MVVMcross предоставляет такие методы, как `SleedSubScribe ', которые позволяют представлению слабо подписываться на события ViewModel. Таким образом, ViewModel не содержит сильную ссылку на представление, предотвращая утечки памяти.

Рекомендации по использованию слабых ссылок в mvvmcross

- Используйте слабые ссылки для представлений: когда ViewModel должна взаимодействовать с представлением, использовать слабые ссылки или системы обмена сообщениями, чтобы избежать удержания циклов.
- Избегайте сильных ссылок на представления: убедитесь, что ViewModels не придерживаются сильных ссылок на представления, позволяющие собирать мусор, когда они больше не нужны.
- Используйте системы обмена сообщениями: рассмотрите возможность использования систем обмена сообщениями, такими как Mvvmcross 'imvxmessenger`, чтобы общаться между ViewModels и представлениями без создания сильных ссылок.

Следуя этим рекомендациям, вы можете эффективно управлять памятью в приложениях MVVMcross и предотвратить общие проблемы, такие как утечки памяти.

Цитаты:
[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_breake_retainer_cycle_betweenge/
[5] https://stackoverflow.com/questions/40966271/weak-reference-androng-reference
[6] https://langdev.stackexchange.com/questions/1351/Appoaches-for-implementing-weak-references
[7] https://putridparrot.com/blog/weakreferences-in-net/
[8] http://java-latte.blogspot.com/2014/07/difference-between-trongreference-weakreference-softrefere-phantomreference-in-java.html