MVVMcross забезпечує збір сміття для підписки на події насамперед за допомогою слабких посилань. Ось детальне пояснення того, як це працює:
Огляд Mvvmcross Messenger
Плагін Mvvmcross Messenger призначений для полегшення агрегації подій між компонентами. Це дозволяє компонентам спілкуватися шляхом публікації та підписки на повідомлення. Messenger використовує слабкі посилання на підписки на події, що допомагає запобігти витоку пам'яті, дозволяючи збирачів сміття видаляти предмети, на які більше не посилаються.
Слабкі посилання в mvvmcross
Коли ви підписуєтесь на повідомлення за допомогою месенджера MVVMCross, ви можете вказати, чи використовувати слабку чи сильну посилання. За замовчуванням MVVMcross використовує слабкі посилання (`mvxreference.weak`) для підписки. Це означає, що Messenger не має сильного посилання на метод зворотного дзвінка, що дозволяє колектору сміття видалити підписку, якщо об'єкт, який підписався, вийде з обсягу.
підписка та скасування
Підписки можна керувати за допомогою декількох методів:
- Підписатися: Повідомлення передаються безпосередньо на видавничу тему.
- Підписка, що підписується: Повідомлення маршалістичні до основного потоку інтерфейсу.
- Підписка, що підписується, повідомлення: Повідомлення в черзі для обробки пулу потоків.
Кожен метод підписки повертає `mvxSubscriptionToken`, який може бути використаний для скасування підписки з повідомлення. Однак, якщо маркер не зберігається, підписка може бути зібраним негайно.
Механізм збору сміття
Механізм збору сміття в mvvmcross покладається на те, що "mvxsubscriptiontoken" є зібраним, коли воно виходить із масштабу. Якщо маркер підписки не зберігається, він буде мати право на збирання сміття, що може призвести до скасування обробника подій. Цей підхід гарантує, що об'єкти не зберігаються в пам'яті без потреби внаслідок підписки на події.
спостереження за станом передплати
MVVMCross також надає методи спостереження за поточним станом підписки, наприклад, `Hassubscriptionsfor` та` countsubscriptionsfor`. Крім того, Messenger публікує повідомлення MVXSUBSCRIBERCHANGEMESSAGE ', коли підписки додаються, видаляють або закінчуються, що дозволяє компонентам адаптувати свою поведінку на основі поточного стану підписки.
Найкращі практики управління пам'яттю
Для забезпечення ефективного збору сміття та запобігання витоку пам’яті:
- Використовуйте слабкі посилання на підписки на події, коли це можливо.
- Зберігайте жетони підписки, якщо вам потрібно чітко керувати підписками.
- Скасувати підписку на подій, коли вони більше не потрібні, особливо якщо використовують сильні посилання.
- Уникайте сильних посилань на об'єкти, які повинні бути зібрані сміття, наприклад, моделі перегляду або перегляд.
Дотримуючись цих практик та використовуючи слабкий механізм підписки MVVMcross, розробники можуть допомогти забезпечити, щоб підписки на події не заважали об'єктам зібрати сміття, тим самим підтримуючи ефективне управління пам'яттю у своїх програмах.
Цитати:[1] https://www.mvvmcross.com/documentation/plugins/messenger
[2] https://stackoverflow.com/questions/39315395/mvvmcross-best-way-to-raese-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-leak-16