„MVVMCross“, kaip ir kitos sistemos, susiduria su iššūkiais su atminties nutekėjimais, kuriuos sukelia įvykių prenumeratos. Šie nutekėjimai įvyksta, kai objektas užsiprenumeruoja įvykį ir nesugeba atsisakyti prenumeratos, todėl objektas išliks atmintyje net ir po to, kai jo nebereikia. Štai kaip „Mvvmcross“ tvarko tokius scenarijus:
Suprasti įvykių tvarkyklės nutekėjimą
Įvykių tvarkytojo nutekėjimai yra įprasti programuojant renginius. Kai trumpalaikis objektas užsiprenumeruoja įvykį iš ilgalaikio objekto, ilgalaikis objektas turi nuorodą į trumpalaikį objektą, neleidžiant jam surinkti šiukšlių. Tai yra reikšmingas klausimas tokiuose rėmuose kaip „MVVMCross“, kai peržiūros ir vaizdų modeliai plačiai sąveikauja per įvykius.
MVVMCROSS požiūris
„MVVMCross“ pateikia įvykių prenumeratų valdymo mechanizmus ir sušvelninti atminties nutekėjimą:
1. Silpnos nuorodos: „MVVMCross“ naudoja silpnas nuorodas, kad padėtų valdyti prenumeratas. Silpnos nuorodos leidžia šiukšlių rinkėjui rinkti objektus, net jei jie nurodomi, tačiau šis požiūris gali sukelti prarastas aktyvių vaizdų modelių prenumeratas. Todėl labai svarbu subalansuoti silpnų ir stiprių nuorodų naudojimą atsižvelgiant į programos poreikius [11].
2. „Messenger“ modelis: „MVVMCross“ naudoja „Messenger“ modelį, kuris leidžia peržiūrėti modelius bendrauti, nesulaukiant stiprių nuorodų vienas į kitą. Šis modelis gali naudoti silpnas nuorodas, kad būtų išvengta atminties nutekėjimo, tačiau reikia kruopštaus valdymo, kad būtų išvengta prarastų prenumeratų [11].
3. Gyvenimo ciklo valdymas: „MVVMCross“ pateikia gyvenimo ciklo metodus peržiūrai ir peržiūros modeliams, tokiems kaip „SavestateToBundle“, kad būtų galima išsaugoti būseną antkampio metu, o tai padeda valdyti išteklius ir prenumeratas žemos atminties situacijose [2]. Kūrėjai turi rankiniu būdu valdyti prenumeratas per šiuos gyvenimo ciklo įvykius, kad išvengtų nuotėkio.
4. Rankinis atsisakymas: „MVVMCross“ kūrėjams patariama rankiniu būdu atsisakyti įvykių prenumeratos, kai vaizdai yra išjungti ar sunaikinti. Tai užtikrina, kad trumpalaikiai objektai nenurodytų ilgalaikių objektų ir taip užkirstų kelią atminties nutekėjimui [11].
geriausia praktika
Norėdami efektyviai sutvarkyti atminties nutekėjimą MVVMCross:
- Naudokite „WearSubscribe“: Jei įmanoma, naudokite silpnąsias prenumeratas, kad išvengtumėte stiprių nuorodų be reikalo laikyti objektus be reikalo [10].
- Rankinis valdymas: Užtikrinkite, kad prenumeratos būtų tinkamai valdomos peržiūros ir peržiūros modelio gyvavimo ciklų metu. Atsisakykite įvykių, kai vaizdai yra išjungti ar sunaikinti [11].
- Stebėkite atminties naudojimą: naudokite profiliavimo įrankius, kad atpažintumėte atminties nutekėjimą ankstyvame kūrimo srityje.
Vykdydami šias strategijas ir geriausią praktiką, kūrėjai gali efektyviai valdyti įvykių prenumeratas ir sušvelninti atminties nutekėjimą MVVMCross programose.
Citatos:[1] https://community.devexpress.com/blogs/mobile/archive/2024/11/05/net-maui-memory-profiling-idrify-and-fix-memory-reaks.aspx
[2] https://www.mvvmcross.com/documentation/fundamentals/viewmodel-lifecycle
[3] https://devblogs.microsoft.com/visualstudio/unlocking-the-secrets-of-laise “-memory-dive-into-event-handler-leak-sights/
[4] https://www.spicelogic.com/blog/net-event-handler-memory-reak-16
[5] https://www.reddit.com/r/dotnetmaui/comments/1c1qlou/maui_memory_leaks/
[6] https://www.markheath.net/post/underped-and-aVoiding-memory-leaks
[7] https://learn.microsoft.com/en-us/shows/xamarinshow/xamarin-community-toolkit-weageventmanager-top-stop-memory-leaks
[8] https://github.com/mvvmcross/mvvmcross/issues/409
[9] https://stackoverflow.com/questions/14771064/garbage-collecting-issue-with-custom-viewbinding-in-mono-touch-and-mvvmcross?rq=1
[10] https://stackoverflow.com/questions/39315395/mvvmcross-best-way-to-reise-event-in-viewmodel
[11] https://stackoverflow.com/questions/27008035/mvvmcross-memory-reak-fecause-of-not-pieping-viewmodels
[12] https://github.com/dotnet/maui/discussions/21918