MVVMCROSS sikrer affaldsindsamling til begivenhedsabonnementer primært ved hjælp af svage referencer. Her er en detaljeret forklaring af, hvordan det fungerer:
Oversigt over MVVMCROSS Messenger
MVVMCROSS Messenger -plugin er designet til at lette begivenhedsaggregering mellem komponenter. Det giver komponenter mulighed for at kommunikere ved at offentliggøre og abonnere på meddelelser. Messenger bruger svage referencer til begivenhedsabonnementer, hvilket hjælper med at forhindre hukommelseslækager ved at give affaldsopsamleren mulighed for at fjerne genstande, der ikke længere henvises til.
Svage referencer i MVVMCross
Når du abonnerer på en meddelelse ved hjælp af MVVMCross Messenger, kan du specificere, om du skal bruge en svag eller stærk reference. Som standard bruger MVVMCROSS svage referencer (`mvxreference.weak`) til abonnementer. Dette betyder, at Messenger ikke har en stærk henvisning til tilbagekaldsmetoden, hvilket giver affaldssamleren mulighed for at fjerne abonnementet, hvis det objekt, der abonnerer, går ud af omfanget.
Abonnement og afbeskrivelse
Abonnementer kan styres ved hjælp af flere metoder:
- Abonner: Meddelelser sendes direkte på forlagstråden.
- AbonneronMainthread: Meddelelser marskaliseres til hoved UI -tråden.
- AbonneronthreadPoolThread: Meddelelser står i kø til behandling af trådpool.
Hver abonnementsmetode returnerer en `MVXSubscriptionToken ', som kan bruges til at afmelde beskeden. Men hvis tokenet ikke er gemt, kan abonnementet kan indsamles affald med det samme.
affaldsindsamlingsmekanisme
Affaldsopsamlingsmekanismen i MVVMCROSS er afhængig af, at `MVXSubscriptionToken 'indsamles, når det går ud af anvendelsesområdet. Hvis et abonnementstoken ikke gemmes, vil det være berettiget til indsamling af skrald, hvilket kan føre til afskrivning af begivenhedshåndtereren. Denne tilgang sikrer, at objekter ikke holdes i hukommelsen unødigt på grund af begivenhedsabonnementer.
Observationsstatus
MVVMCROSS leverer også metoder til at observere den aktuelle abonnementsstatus, såsom `HassubScriptionsFor 'og` tællerbeskrivelser for'. Derudover offentliggør Messenger `MVXSubScriberChangemessage '-meddelelser, når abonnementer tilføjes, fjernes eller udløber, hvilket giver komponenter mulighed for at tilpasse deres opførsel baseret på den aktuelle abonnementstilstand.
Bedste praksis til hukommelsesstyring
For at sikre effektiv affaldsopsamling og forhindre hukommelseslækager:
- Brug svage referencer til begivenhedsabonnementer, når det er muligt.
- Butik abonnementstokens, hvis du har brug for at administrere abonnementer eksplicit.
- Afmeld dig fra begivenheder, hvor de ikke længere er nødvendige, især hvis de bruger stærke referencer.
- Undgå at holde stærke henvisninger til genstande, der skal indsamles affald, såsom visningsmodeller eller visninger.
Ved at følge denne praksis og udnytte MVVMCross's svage abonnementsmekanisme kan udviklere hjælpe med at sikre, at begivenhedsabonnementer ikke forhindrer genstande i at blive indsamlet affald, hvilket opretholder effektiv hukommelsesstyring i deres applikationer.
Citater:[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
)
)
[8] https://www.mvvmcross.com/documentation/advanced/customizing-sising-app-and-setup
[9] https://www.spicelogic.com/blog/net-event-handler-memory-leak-16