Az MVVMCross a szemétgyűjtést biztosítja az esemény előfizetésekhez, elsősorban a gyenge referenciák használatával. Íme egy részletes magyarázat arról, hogyan működik:
Az MVVMCross Messenger áttekintése
Az MVVMCross Messenger beépülő modul célja az alkatrészek közötti esemény -aggregáció megkönnyítése. Ez lehetővé teszi az összetevők számára, hogy kommunikáljanak az üzenetek közzétételével és előfizetésével. A Messenger gyenge referenciákat használ az esemény előfizetéseire, amely segít megelőzni a memória szivárgását azáltal, hogy lehetővé teszi a szemétgyűjtő számára, hogy eltávolítsa a már nem hivatkozott tárgyakat.
gyenge referenciák az mvvmcross -ban
Amikor az MVVMCross Messenger használatával feliratkozik egy üzenetre, akkor meghatározhatja, hogy használ -e gyenge vagy erős referenciát. Alapértelmezés szerint az MVVMCross gyenge referenciákat (`mvxreference.weak`) használ az előfizetésekhez. Ez azt jelenti, hogy a Messenger nem rendelkezik erős utalással a visszahívási módszerre, lehetővé téve a szemétgyűjtőnek, hogy eltávolítsa az előfizetést, ha az előfizetett objektum kimarad.
előfizetés és leírás
Az előfizetések több módszerrel kezelhetők:
- Feliratkozás: Az üzeneteket közvetlenül a kiadói szálon továbbítják.
- Előfizetés: Az üzeneteket a fő felhasználói felület szálához igazítják.
- Előfizetés -ThreadPoolThread: Az üzenetek sorba állnak a szálkészlet feldolgozásához.
Minden előfizetési módszer egy `mvxsubscriptionToken" -et ad vissza, amely felhasználható az üzenet leiratkozásához. Ha azonban a tokent nem tárolják, az előfizetés azonnal össze lehet gyűjteni.
A szemétgyűjtési mechanizmus
Az MVVMCross szemétgyűjtési mechanizmusa az „MvxSubscriptionToken” olyan szemétre támaszkodik, amelyet összegyűjtöttek, amikor kimegy a hatályból. Ha az előfizetési tokent nem tárolják, akkor a szemétgyűjtéshez jogosult, ami az eseménykezelő leírásához vezethet. Ez a megközelítés biztosítja, hogy az objektumokat ne tartsák a memóriában szükségtelenül az esemény előfizetések miatt.
Az előfizetési állapot megfigyelése
Az MVVMCross módszereket is biztosít a jelenlegi előfizetési állapot megfigyelésére, például a „HassubscriptionsFor” és a „CountSubscriptionsfor”. Ezenkívül a Messenger közzéteszi az `mvxSubscriperChangeMessage" üzeneteket, amikor előfizetéseket adnak hozzá, eltávolítanak vagy lejárnak, lehetővé téve az összetevők számára, hogy viselkedésüket a jelenlegi előfizetési állapot alapján adaptálják.
A memóriakezelés legjobb gyakorlatai
A hatékony hulladékgyűjtés biztosítása és a memória szivárgásainak megelőzése:
- Használjon gyenge referenciákat az esemény előfizetésekhez, amikor csak lehetséges.
- Az előfizetési tokenek tárolása, ha kifejezetten kell kezelnie az előfizetéseket.
- Leiratkozzon az eseményekre, amikor már nincs szükségük rá, különösen, ha erős hivatkozásokat használ.
- Kerülje el az erős hivatkozások tartását az összegyűjtött szemétnek, például a modellek vagy nézetek nézetének.
Ezeknek a gyakorlatoknak a betartásával és az MVVMCross gyenge előfizetési mechanizmusának kihasználásával a fejlesztők segíthetnek abban, hogy az események előfizetése ne akadályozza meg az objektumok összegyűjtését, ezáltal fenntartva a hatékony memóriakezelést alkalmazásaikban.
Idézetek:[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-andsetup
[9] https://www.spicelogic.com/blog/net-event-handler-memory-leak-16