Home Arrow Icon Knowledge base Arrow Icon Global Arrow Icon Чим слабкий зразок подій відрізняється від класичних подій у Mvvmcross


Чим слабкий зразок подій відрізняється від класичних подій у Mvvmcross


Слабка схема подій та класичні події в MVVMCross (або будь -яких .NET Framework) служать різним цілям і мають чіткі реалізації, в першу чергу, спрямовані на управління витоками пам'яті та терміном експлуатації об'єктів.

Класичні події

Класичні події в .NET засновані на сильних посилань. Коли об'єкт підписується на подію іншого об'єкта, з джерела подій створюється сильна посилання на джерело події до абонента. Це означає, що до тих пір, поки джерело події має посилання на абонента, абонент не може бути зібраним сміттям, навіть якщо він більше не потрібен або не посилається в інших місцях програми. Це може призвести до витоків пам'яті, якщо абонент не буде чітко скасовано від події, коли це більше не потрібно.

У MVVMCross класичні події можуть використовуватися для спілкування між ViewModels та Views, але вони потребують ретельного управління, щоб уникнути витоків пам'яті. Наприклад, якщо ViewModel розкриє подію та перегляд підписується на неї, ViewModel буде мати сильне посилання на перегляд, заважаючи йому зібрати сміття, поки підписка явно не буде видалена.

Слабка схема подій

Слабка схема події розроблена для запобігання витоку пам'яті, використовуючи слабкі посилання замість сильних. Коли абонент використовує слабку схему події для підписки на подію, джерело події має слабку посилання на абонента. Це дозволяє зібраним для абонента сміття, якщо на нього більше не посилається в інших місцях програми, навіть якщо воно не було чітко підписано з події.

У MVVMCross, використання слабких подій може допомогти підтримувати чисту архітектуру, гарантуючи, що ViewModels не має сильних посилань на погляди. Це особливо важливо в мобільних додатках, де управління пам'яттю є критичним. MVVMcross забезпечує розширення, такі як `sempubscribe` для полегшення використання слабких подій, що дозволяє розробникам підписатися на події, не створюючи сильних посилань, які можуть призвести до витоків пам'яті.

Впровадження та переваги

Реалізація слабких подій, як правило, передбачає створення спеціального механізму для управління підписками за допомогою об'єктів `sempreference`. Цей підхід гарантує, що абоненти можуть бути зібрані сміття, якщо вони більше не потрібні, зменшуючи ризик витоків пам'яті. Однак він також вводить додаткову складність та незначну продуктивність завдяки необхідності перевірити, чи передплатники ще живі, перш ніж зателефонувати до своїх обробників подій.

недоліки та міркування

Незважаючи на те, що слабка схема подій вигідна для запобігання витоку пам'яті, вона має деякі недоліки. Це може бути складніше для впровадження, ніж класичні події, і є ризик "зомбі" об'єктів абонентів, які вже не використовуються, але ще не були зібрані сміття. Якщо подія піднята і виконується обробник абонента зомбі, це може призвести до несподіваної поведінки або помилок.

Підводячи підсумок, слабка схема подій у MVVMcross відрізняється від класичних подій за допомогою слабких посилань для запобігання витоку пам'яті та дозволяє передплатникам простіше зібрати сміття. Хоча він пропонує значні переваги з точки зору управління пам'яттю, він вимагає ретельного впровадження та врахування потенційних недоліків.

Цитати:
[1] https://stackoverflow.com/a/19379912
[2] http://stackoverflow.com/questions/30848118/capting-the-onexit-event-wpf-with-mvvmcross/31784453
[3] https://www.reactiveui.net/vs/mvvmcross
[4] https://mustafacanyucel.com/blog/blog-22.html
[5] https://ladimolnar.com/2015/09/14/the-weak-event-pattern-is-dangry/
[6] https://www.mvvmcross.com/mvvmcross-6.0.0-release/
[7] https://yanxiaodi.gitbook.io/xamarin-mvvmcross-handbook/using-mvvmcross-to-create-your-first-xamarin-app/navigation/respning-the-events-from-different-controls-in-the-listing-theevents-from-different-controls-in-the-listview
[8] https://www.devleader.ca/2024/02/14/weak-events-in---how-to-avoid-nasty-memory-leaks
[9] https://learn.microsoft.com/en-us/dotnet/desktop/wpf/events/weak-event-patterns?view=netdesktop-9.0
[10] https://www.mvvmcross.com/documentation/fundamentals/navigation
[11] https://www.mvvmcross.com/documentation/fundamentals/viewmodel-lifecycle
[12] https://stackoverflow.com/questions/13788787/when-to-use-weak-events