Home Arrow Icon Knowledge base Arrow Icon Global Arrow Icon Hvordan sikrer MVVMCROSS søppelinnsamling for abonnement for hendelser


Hvordan sikrer MVVMCROSS søppelinnsamling for abonnement for hendelser


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