MVVMCROSS säkerställer skräpuppsamling för evenemangsprenumerationer främst genom användning av svaga referenser. Här är en detaljerad förklaring av hur det fungerar:
Översikt över MVVMCross Messenger
MVVMCross Messenger -plugin är utformat för att underlätta händelseaggregering mellan komponenter. Det gör det möjligt för komponenter att kommunicera genom att publicera och prenumerera på meddelanden. Messenger använder svaga referenser för evenemangsabonnemang, vilket hjälper till att förhindra minnesläckor genom att låta skräpsamlaren ta bort objekt som inte längre hänvisas till.
Svaga referenser i MVVMCross
När du prenumererar på ett meddelande med MVVMCross Messenger kan du ange om du vill använda en svag eller stark referens. Som standard använder MVVMCross svaga referenser (`mvxreference.weak`) för prenumerationer. Detta innebär att Messenger inte har en stark hänvisning till återuppringningsmetoden, vilket gör att skräpsamlaren kan ta bort prenumerationen om objektet som prenumererar går ut ur räckvidden.
Prenumeration och avbeskrivning
Prenumerationer kan hanteras med flera metoder:
- Prenumerera: Meddelanden skickas direkt på publiceringstråden.
- PrenumeranAnMainthread: Meddelanden är marskalkade till den huvudsakliga UI -tråden.
- PrenumereraOnThreadPoolThread: Meddelanden står i kö för trådpoolbehandling.
Varje prenumerationsmetod returnerar en `mvxsubscriptionToken`, som kan användas för att avsluta prenumerationen på meddelandet. Men om token inte lagras kan prenumerationen samlas in omedelbart.
Garbagsamlingsmekanism
Skräpuppsamlingsmekanismen i MVVMCross förlitar sig på att "mvxSubscriptionToken" är skräp som samlas in när det går ut ur räckvidden. Om ett prenumerationstoken inte lagras kommer den att vara berättigad till skräpuppsamling, vilket kan leda till avskrivning av evenemangshanteraren. Detta tillvägagångssätt säkerställer att objekt inte hålls i minnet onödigt på grund av evenemangsabonnemang.
Observera prenumerationsstatus
MVVMCross tillhandahåller också metoder för att observera den aktuella prenumerationsstatusen, till exempel `HassubscriptionSfor` och` CountsUbscriptionSfor`. Dessutom publicerar Messenger `MVXSUBSCRIBERCHANGEMESSAGE '-meddelanden när prenumerationer läggs till, tas bort eller löper ut, vilket gör att komponenter kan anpassa sitt beteende baserat på det aktuella prenumerationstillståndet.
Bästa metoder för minneshantering
För att säkerställa en effektiv skräppost och förhindra minnesläckor:
- Använd svaga referenser för evenemangsabonnemang när det är möjligt.
- Förvara prenumerationstokens om du behöver hantera prenumerationer uttryckligen.
- avsluta prenumerationen på händelser när de inte längre behövs, särskilt om du använder starka referenser.
- Undvik att hålla starka referenser till objekt som bör samlas in, till exempel visningsmodeller eller vyer.
Genom att följa dessa metoder och utnyttja MVVMCross svaga prenumerationsmekanism kan utvecklare hjälpa till att säkerställa att evenemangsprenumerationer inte förhindrar objekt från att samlas in och därmed bibehålla effektiv minneshantering i sina applikationer.
Citeringar:[1] https://www.mvvmcross.com/documentation/plugins/messenger
]
[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
]
[7] https://stackoverflow.com/questions/30798429/mvvmcross-android-viewmodel-never-garbage-sam
[8] https://www.mvvmcross.com/documentation/advanced/customizing-using-app-and-setup
[9] https://www.spicelogic.com/blog/net-event-Handler-memory-leak-16