MVVMcross обеспечивает сборку мусора для подписок на события, прежде всего, благодаря использованию слабых ссылок. Вот подробное объяснение того, как это работает:
Обзор Mvvmcross Messenger
Плагин MVVMcross Messenger предназначен для облегчения агрегации событий между компонентами. Это позволяет компонентам общаться, публикуя и подписываясь на сообщения. Messenger использует слабые ссылки для подписок на события, что помогает предотвратить утечки памяти, позволяя сборщику мусора удалять объекты, на которые больше не упоминаются.
Слабые ссылки в MVVMcross
Когда вы подписываетесь на сообщение, используя Mvvmcross Messenger, вы можете указать, использовать ли слабая или сильная ссылка. По умолчанию MVVMcross использует слабые ссылки (`mvxreference.weak`) для подписок. Это означает, что Messenger не содержит прочную ссылку на метод обратного вызова, что позволяет сборщику мусора удалять подписку, если подписанный объект, который подписан, выходит из сферы действия.
Подписка и отписка
Подписки можно управлять с помощью нескольких методов:
- Подписаться: сообщения передаются непосредственно в ветке публикации.
- Подписаться на Mainthread: Сообщения привязаны к основной потоке пользовательского интерфейса.
- specpcribeonthreadpoolthread: Сообщения в очереди для обработки пула потоков.
Каждый метод подписки возвращает `mvxsubscriptiontoken`, который можно использовать для отмены подписки на сообщение. Однако, если токен не хранится, подписка может быть немедленно собрана мусор.
Механизм сбора мусора
Механизм сбора мусора в MVVMcross зависит от «mvxsubscriptiontoken», собираемого мусора, когда он выходит из прицела. Если токен подписки не хранится, он будет иметь право на сбор мусора, что может привести к отказа от обработчика событий. Этот подход гарантирует, что объекты не хранятся в памяти излишне из -за подписок на события.
Наблюдение за статусом подписки
MVVMcross также предоставляет методы для наблюдения за текущим статусом подписки, такими как `hassubscriptions for` и` countsubscriptions for. Кроме того, Messenger публикует сообщения mvxsubscriberchangemessage`, когда подписки добавляются, удаляются или истекают, что позволяет компонентам адаптировать свое поведение на основе текущего состояния подписки.
лучшие практики для управления памятью
Для обеспечения эффективной сбора мусора и предотвращения утечек памяти:
- Используйте слабые ссылки для подписок на события, когда это возможно.
- Храните токены подписки, если вам нужно явно управлять подписками.
- Отписаться от событий, когда они больше не нужны, особенно при использовании сильных ссылок.
- Избегайте сохранения сильных ссылок на объекты, которые должны быть собраны мусором, например, модели вида или представления.
Следуя этой практике и используя слабый механизм подписки MVVMcross, разработчики могут помочь гарантировать, что подписки на события не предотвращают собирать мусор, что поддерживает эффективное управление памятью в своих приложениях.
Цитаты:[1] https://www.mvvmcross.com/documentation/plugins/messenger
[2] https://stackoverflow.com/questions/39315395/mvvmcross-best-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-gotcha-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-garbage-collected
[8] https://www.mvvmcross.com/documentation/advanced/customizing-using-app-and-setup
[9] https://www.spicelogic.com/blog/net-event-handler-memory-hleak-16