Home Arrow Icon Knowledge base Arrow Icon Global Arrow Icon Как MVVMcross обеспечивает сборку мусора для подписок на мероприятия


Как MVVMcross обеспечивает сборку мусора для подписок на мероприятия


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