MVVMCROSS sikrer søppelinnsamling for hendelsesabonnement først og fremst gjennom bruk av svake referanser. Her er en detaljert forklaring på hvordan det fungerer:
Oversikt over mvvmcross messenger
MVVMCROSS Messenger -plugin er designet for å lette hendelsesaggregasjonen mellom komponenter. Det lar komponenter kommunisere ved å publisere og abonnere på meldinger. Messenger bruker svake referanser for hendelsesabonnement, noe som hjelper til med å forhindre minnelekkasjer ved å la søppelsamleren fjerne gjenstander som ikke lenger er referert til.
Svake referanser i MVVMCROSS
Når du abonnerer på en melding ved hjelp av MVVMCROSS MESSENGER, kan du spesifisere om du vil bruke en svak eller sterk referanse. Som standard bruker MVVMCROSS svake referanser (`mvxreference.weak`) for abonnement. Dette betyr at messenger ikke har en sterk henvisning til tilbakeringingsmetoden, slik at søppelkollektoren kan fjerne abonnementet hvis objektet som abonnerer går ut av omfanget.
abonnement og avmelding
Abonnement kan administreres ved hjelp av flere metoder:
- Abonner: Meldinger sendes direkte på publiseringstråden.
- Abonner på Mainthread: Meldinger er marshaled til den viktigste UI -tråden.
- AbonneringArthreadPooltThread: Meldinger står i kø for prosessering av trådbasseng.
Hver abonnementsmetode returnerer en `mvxsubscriptiontoken`, som kan brukes til å melde deg ut fra meldingen. Imidlertid, hvis symbolet ikke er lagret, kan abonnementet være søppel samlet umiddelbart.
søppelkolleksjonsmekanisme
Søppelkolleksjonsmekanismen i MVVMCROSS er avhengig av `mvxsubscriptiontoken` som blir søppel samlet når det går ut av omfanget. Hvis et abonnementstoken ikke er lagret, vil det være kvalifisert for søppelinnsamling, noe som kan føre til avmelding av hendelsesbehandleren. Denne tilnærmingen sikrer at objekter ikke holdes i minnet unødvendig på grunn av hendelsesabonnement.
Observasjon av abonnementsstatus
MVVMCROSS gir også metoder for å observere gjeldende abonnementsstatus, for eksempel `Hassubscriptsfor` og` CountSubscriptsfor`. I tillegg publiserer Messenger `MVXSubscriberChangemessage` -meldinger når abonnement blir lagt til, fjernet eller utløper, slik at komponenter kan tilpasse oppførselen sin basert på gjeldende abonnementstilstand.
Beste praksis for minnestyring
For å sikre effektiv søppelinnsamling og forhindre lekkasjer fra minnet:
- Bruk svake referanser for hendelsesabonnement når det er mulig.
- Lagre abonnementstokener hvis du trenger å administrere abonnement eksplisitt.
- Avslutt abonnementet fra hendelser når de ikke lenger er nødvendig, spesielt hvis du bruker sterke referanser.
- Unngå å holde sterke referanser til gjenstander som bør samles søppel, for eksempel visningsmodeller eller visninger.
Ved å følge denne praksis og utnytte MVVMCROSSs svake abonnementsmekanisme, kan utviklere bidra til å sikre at hendelsesabonnement ikke forhindrer at gjenstander blir samlet søppel, og dermed opprettholde effektiv minnestyring i applikasjonene sine.
Sitasjoner:[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-mvmcross
[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-US-MVVM-LIGHT-ISTEAD-of-MVMCROSS/V-15/
[7] https://stackoverflow.com/questions/30798429/mvvmcross-android-viewmodel-never-garbage-collected
[8] https://www.mvvmcross.com/documentation/advanced/customizing-using-apps-av-and-setup
[9] https://www.spicelogic.com/blog/net-event-handler-memory-leak-16