Az MVVMCross, akárcsak más keretekhez hasonlóan, kihívásokkal néz szembe az esemény előfizetések által okozott memóriaszivárgásokkal. Ezek a szivárgások akkor fordulnak elő, amikor egy objektum feliratkozik egy eseményre, és elmulasztja leiratkozni, ami az objektum memóriában marad, még akkor is, ha már nincs rá szükség. Így kezeli az MVVMCross ilyen forgatókönyveket:
Az eseménykezelő megértése szivárog
Az eseménykezelő szivárgásai gyakoriak az eseményvezérelt programozásban. Amikor egy rövid élettartamú objektum egy hosszú élettartamú objektumból feliratkozik egy eseményre, a hosszú élettartamú objektum hivatkozik a rövid életű objektumra, megakadályozva, hogy a szemét összegyűjtése legyen. Ez egy jelentős kérdés a keretekben, mint például az MVVMCross, ahol a nézetek és a nézetek a modellek széles körben kölcsönhatásba lépnek az események révén.
mvvmcross megközelítés
Az MVVMCross mechanizmusokat biztosít az esemény előfizetéseinek kezelésére és a memória szivárgásainak enyhítésére:
1. gyenge referenciák: Az MVVMCross gyenge referenciákat használ az előfizetések kezelésére. A gyenge referenciák lehetővé teszik a szemétgyűjtő számára, hogy objektumokat gyűjtsön, még akkor is, ha hivatkoznak, de ez a megközelítés elveszíthet az aktív nézet modellek elvesztett előfizetéseit. Ezért döntő fontosságú az egyensúly a gyenge és erős referenciák használata az alkalmazás igényei alapján [11].
2. Messenger minta: Az MVVMCross a Messenger mintát alkalmazza, amely lehetővé teszi a nézetmodellek kommunikációját anélkül, hogy erős hivatkozásokat tartana egymásra. Ez a minta gyenge hivatkozásokat használhat a memória szivárgásainak megelőzésére, de az előfizetések elvesztésének elkerülése érdekében gondos kezelést igényel [11].
3. életciklus-kezelés: Az MVVMCross életciklus-módszereket biztosít a nézetekhez és a nézetmodellekhez, mint például a „SaveStateBundle” az állapot megtakarításához a sírok során, ami elősegíti az erőforrások és az előfizetések kezelését alacsony memória helyzetekben [2]. A fejlesztőknek a szivárgások megelőzése érdekében manuálisan kell kezelniük az előfizetéseket ezen életciklus események során.
4. Kézi leírás: Az MVVMCross -ban a fejlesztőknek azt javasoljuk, hogy manuálisan leiratkozzanak az eseményekről, amikor a nézeteket deaktiválják vagy megsemmisítik. Ez biztosítja, hogy a rövid élettartamú objektumok ne maradjanak a hosszú élettartamú tárgyak, ezáltal megakadályozzák a memória szivárgását [11].
A legjobb gyakorlatok
A memória szivárgásainak hatékony kezelése az mvvmcross -ban:
- Használja a gyenge szubscrift: Ha lehetséges, használjon gyenge előfizetéseket, hogy megakadályozzák az erős referenciákat, hogy az objektumokat szükségtelenül tartsák a memóriában [10].
- Kézi kezelés: Győződjön meg arról, hogy az előfizetések megfelelően kezelhetők a nézet és a Model LifeCycles megtekintése során. Leiratkozás az eseményekről, amikor a nézeteket deaktiválják vagy megsemmisítik [11].
- A memória használatának figyelése: Használjon profilos eszközöket a memória szivárgásainak azonosításához a fejlesztés korai szakaszában.
Ezen stratégiák és bevált gyakorlatok betartásával a fejlesztők hatékonyan kezelhetik az események előfizetéseit és enyhíthetik a memória szivárgásait az MVVMCross alkalmazásokban.
Idézetek:[1] https://community.devexpress.com/blogs/mobile/archive/2024/11/05/net-maui-memory-profiling-dentify-and-fix-memory-leaks.aspx
[2] https://www.mvvmcross.com/documentation/fundamentals/viewmodel-lifecycle
[3] https://devblogs.microsoft.com/visualStudio/unlocking-the-secrets-ofenaed-memory-dent-event-handler-leak-sights/
[4] https://www.spicelogic.com/blog/net-event-handler-memory-leak-16
[5] https://www.reddit.com/r/dotnetmaui/comments/1c1qlou/maui_memory_leaks/
[6] https://www.markheath.net/post/understing-and-wecoiding-memory-leaks
[7] https://learn.microsoft.com/en-us/shows/xamarinshow/xamarin-community-toolkit-weakeventmanager-top-memory-leaks
[8] https://github.com/mvvmcross/mvvmcross/issues/409
[9] https://stackoverflow.com/questions/14771064/garbage-celling-issue-with-cithom-viewbinding-in-touch-and-mvvmcross?rq=1
[10] https://stackoverflow.com/questions/39315395/mvvmcross-best-way-to-raise-event-in-viewmodel
[11] https://stackoverflow.com/questions/27008035/mvvmcross-memory-leak-beause-of-not-disposed-viewmodels
[12] https://github.com/dotnet/maui/discussions/21918