Home Arrow Icon Knowledge base Arrow Icon Global Arrow Icon Kako MVVMcross zagotavlja zbiranje smeti za naročnine na dogodke


Kako MVVMcross zagotavlja zbiranje smeti za naročnine na dogodke


MVVMcross zagotavlja zbiranje smeti za naročnine na dogodke predvsem z uporabo šibkih referenc. Tu je podrobna razlaga, kako deluje:

Pregled MVVMcross Messengerja

Vtičnik MVVMcross Messenger je zasnovan tako, da olajša združevanje dogodkov med komponentami. Komponentom omogoča komunikacijo z objavo in naročanjem na sporočila. Messenger uporablja šibke reference za naročnine na dogodke, kar pomaga preprečiti puščanje pomnilnika, tako da zbiralnikom smeti omogoča odstranjevanje predmetov, na katere ni več omenjenih.

Šibke reference v mvvmcross

Ko se naročite na sporočilo z MVVMcross Messenger, lahko določite, ali uporabite šibko ali močno referenco. MVVMcross privzeto uporablja šibke reference (`mvxreference.weak`) za naročnine. To pomeni, da messenger ne drži močnega sklicevanja na metodo povratnega klica, kar omogoča zbiralcu smeti, da odstrani naročnino, če predmet, ki se je naročil, izstopi iz obsega.

Naročnina in odjava

Naročnine lahko upravljate z več metodami:
- Naročite se: Sporočila se pošljejo neposredno na založniški nit.
- NasvojanmaintHread: Sporočila so privezana na glavno nit uporabniškega vmesnika.
- NascribeOnThreadPoolThread: Sporočila so v čakalni vrsti za obdelavo nit.

Vsaka naročniška metoda vrne `mvxSubscriptionToken`, ki jo lahko uporabite za odjavo iz sporočila. Če pa žeton ni shranjen, se lahko naročnina takoj zbira smeti.

Mehanizem za zbiranje smeti

Mehanizem zbiranja smeti v MVVMcross se opira na to, da je "mvxSubscriptionToken" smeti, zbrano, ko izstopi iz obsega. Če naročninski žeton ni shranjen, bo upravičen do odbitka smeti, kar lahko privede do odjave obdelovalca dogodkov. Ta pristop zagotavlja, da se predmeti ne hranijo v pomnilniku po nepotrebnem zaradi naročnin na dogodke.

Opazovanje stanja naročnine

MVVMcross ponuja tudi metode za opazovanje trenutnega statusa naročnine, kot sta "hassubScriptionsFor" in "countSubScriptionsFor". Poleg tega Messenger objavlja sporočila MVXSubscriberChangeMessage`, kadar so naročnine dodane, odstranjene ali poteče, kar omogoča komponentam, da prilagodijo svoje vedenje na podlagi trenutnega naročniškega stanja.

Najboljše prakse za upravljanje pomnilnika

Za zagotovitev učinkovitega odvzema smeti in preprečevanje puščanja pomnilnika:
- Kadar je le mogoče, uporabite šibke reference za naročnine na dogodke.
- Shranite naročnine, če morate izrecno upravljati naročnine.
- Odjavite se iz dogodkov, ko jih ni več potrebno, še posebej, če uporabljate močne reference.
- Izogibajte se močnemu sklicevanju na predmete, ki bi morali biti zbrani smeti, na primer modeli ali pogledi.

Z upoštevanjem teh praks in izkoriščanjem šibkega mehanizma naročnine MVVMCrossa lahko razvijalci pomagajo zagotoviti, da naročnine na dogodke ne preprečujejo zbiranja smeti, s čimer ohranijo učinkovito upravljanje pomnilnika v svojih aplikacijah.

Navedbe:
[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/isissue/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-never-warbage
[8] https://www.mvvmcross.com/documentation/advanced/customizing-using-app-and-setup
[9] https://www.spicelogic.com/blog/net-event-handler-memory-leak-16