MVVMCROSS nodrošina atkritumu savākšanu notikumu abonēšanai galvenokārt, izmantojot vājas atsauces. Šeit ir detalizēts skaidrojums, kā tas darbojas:
Pārskats par MVVMCROSS Messenger
MVVMCROSS Messenger spraudnis ir paredzēts, lai atvieglotu notikumu agregāciju starp komponentiem. Tas ļauj komponentiem sazināties, publicējot un abonējot ziņojumus. Messenger izmanto vājas atsauces notikumu abonementiem, kas palīdz novērst atmiņas noplūdes, ļaujot atkritumu savācējam noņemt objektus, uz kuriem vairs nav atsauces.
Vājas atsauces MVVMCROSS
Abonējot ziņojumu, izmantojot MVVMCROSS Messenger, varat norādīt, vai izmantot vāju vai spēcīgu atsauci. Pēc noklusējuma MVVMCross abonēšanai izmanto vājas atsauces (`mvxreference.weak`). Tas nozīmē, ka Messenger neuztur spēcīgu atsauci uz atzvanīšanas metodi, ļaujot atkritumu savācējam noņemt abonementu, ja abonētais objekts iziet no darbības jomas.
abonements un abonēšana
Abonēšanu var pārvaldīt, izmantojot vairākas metodes:
- Abonēt: ziņojumi tiek nodoti tieši publicēšanas pavedienā.
- SubronteOnMainThread: ziņojumi tiek izmantoti galvenajā lietotāja saskarnes pavedienā.
- SubronteOnThreadPoolThread: ziņojumi tiek rindā uz pavedienu baseina apstrādi.
Katra abonēšanas metode atgriež `mvxsubscriptionToken`, kuru var izmantot, lai abonētu no ziņojuma. Tomēr, ja marķieris netiek glabāts, abonementu var nekavējoties savākt atkritumus.
atkritumu savākšanas mehānisms
Atkritumu savākšanas mehānisms MVVMCROSS balstās uz to, ka “MVXSubScriptionToken` tiek savākti atkritumi, kad tas iziet no darbības jomas. Ja abonementa marķieris netiek glabāts, tas varēs pretendēt uz atkritumu savākšanu, kas var izraisīt notikumu apstrādātāja abonēšanu. Šī pieeja nodrošina, ka objekti netiek turēti atmiņā nevajadzīgi notikumu abonēšanas dēļ.
Abonēšanas statusa novērošana
MVVMCROSS nodrošina arī metodes, kā novērot pašreizējo abonēšanas statusu, piemēram, `hassubscriptionsfor` un` countSubScriptionSFor`. Turklāt Messenger publicē “MVXSubskriberChangeMessage” ziņojumus, kad abonementi tiek pievienoti, noņemti vai beidzas, ļaujot komponentiem pielāgot savu izturēšanos, pamatojoties uz pašreizējo abonēšanas stāvokli.
Atmiņas pārvaldības paraugprakse
Lai nodrošinātu efektīvu atkritumu savākšanu un novērstu atmiņas noplūdi:
- Kad vien iespējams, izmantojiet vājas atsauces notikumu abonēšanai.
- Uzglabājiet abonēšanas marķierus, ja jums ir nepieciešams skaidri pārvaldīt abonementus.
- Abonēt no notikumiem, kad tie vairs nav nepieciešami, it īpaši, ja izmantojat spēcīgas atsauces.
- Izvairieties no stingrām atsaucēm uz objektiem, kuriem vajadzētu savākt atkritumus, piemēram, skatu modeļus vai skatus.
Ievērojot šo praksi un piesaistot MVVMCROSS vājo abonēšanas mehānismu, izstrādātāji var palīdzēt nodrošināt, ka notikumu abonēšana neliedz objektiem savākt atkritumus, tādējādi saglabājot efektīvu atmiņas pārvaldību savās lietojumprogrammās.
Atsauces:[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
[6] https://livebook.manning.com/book/xamarin-in-acaction/b-using-mvvm-light-instead-of-mvvmcross/v-15/
,
[8] https://www.mvvmcross.com/documentation/advanced/customing-using-app-and-setup
[9] https://www.spicelogic.com/blog/net-event-handler-memory-leak-16