„MVVMCross“ užtikrina šiukšlių rinkimą renginių prenumeracijoms pirmiausia naudojant silpnas nuorodas. Čia yra išsamus paaiškinimas, kaip jis veikia:
„MVVMCross Messenger“ apžvalga
„MVVMCross Messenger“ papildinys yra skirtas palengvinti įvykių sujungimą tarp komponentų. Tai leidžia komponentams bendrauti publikuojant ir užsiprenumeravus pranešimus. „Messenger“ naudoja silpnas įvykių prenumeratų nuorodas, o tai padeda išvengti atminties nutekėjimo, leisdamas šiukšlių rinkikliui pašalinti objektus, kurie nebėra nurodyti.
Silpnos nuorodos MVVMCROSS
Kai užsiprenumeruojate pranešimą naudodami „MVVMCross Messenger“, galite nurodyti, ar naudoti silpną, ar stiprią nuorodą. Pagal numatytuosius nustatymus „MVVMCross“ prenumeratos naudoja silpnąsias nuorodas (`mvxReference.weak`). Tai reiškia, kad „Messenger“ neturi tvirtos nuorodos į atgalinio ryšio metodą, leisdamas šiukšlių rinkėjui pašalinti prenumeratą, jei prenumeruotas objektas išeina iš apimties.
Prenumerata ir atsisakymas
Prenumeratos gali būti valdomos keliais būdais:
- Prenumeruokite: pranešimai perduodami tiesiogiai leidybos gijai.
- „PrenumeCenMainThread“: žinutės yra nukreiptos į pagrindinę vartotojo sąsajos giją.
- „PrenumeRenThreadPoolThread“: pranešimai yra eilėje, kad būtų galima apdoroti gijų baseiną.
Kiekvienas prenumeratos metodas grąžina „MVXSubscriptionToken“, kurį galima panaudoti atsisakyti pranešimo prenumeratos. Tačiau jei žetonas nebus saugomas, prenumerata gali būti nedelsiant surinkta šiukšlėmis.
šiukšlių surinkimo mechanizmas
MVVMCROSS šiukšlių surinkimo mechanizmas priklauso nuo to, ar „MVXSubscriptiontoken“ yra šiukšlių, surinktų, kai jis išeina iš apimties. Jei prenumeratos prieigos raktas nebus saugomas, jis galės surinkti šiukšles, o tai gali sukelti „Event Handler“ atsisakymą. Šis požiūris užtikrina, kad objektai nebūtinai laikomi atmintyje dėl įvykių prenumeratų.
Stebėjimo prenumeratos būsena
„MVVMCross“ taip pat pateikia metodus, kaip stebėti dabartinę prenumeratos būseną, pavyzdžiui, „HassubscriptionsFor“ ir „CountSubscriptionsFor“. Be to, „Messenger“ skelbia „MVXSUBSCREBRERCHAGHAGEMESSAGE“ pranešimus, kai pridedami, pašalinami ar galiojantys prenumeratos, leidžiančios komponentams pritaikyti savo elgesį pagal dabartinę prenumeratos būseną.
geriausia atminties valdymo praktika
Norėdami užtikrinti veiksmingą šiukšlių rinkimą ir užkirsti kelią atminties nutekėjimui:
- Kai įmanoma, naudokite silpnąsias nuorodas renginių prenumeracijoms.
- parduotuvės prenumeratos žetonai, jei jums reikia aiškiai valdyti prenumeratas.
- Atsisakykite įvykių, kai jų nebereikia, ypač jei naudojate stiprias nuorodas.
- Venkite tvirtų nuorodų į objektus, kurie turėtų būti surinkti šiukšles, pavyzdžiui, peržiūros modelius ar vaizdus.
Vykdydami šią praktiką ir pasinaudodami silpnu „MVVMCross“ prenumeratos mechanizmu, kūrėjai gali padėti užtikrinti, kad įvykių prenumeratos netrukdytų surinkti daiktų, todėl jų programose išlaikys efektyvų atminties valdymą.
Citatos:[1] https://www.mvvmcross.com/documentation/plugins/messenger
[2] https://stackoverflow.com/questions/39315395/mvvmcross-best-way-to-reise-event-in-viewmodel
[3] https://stackoverflow.com/questions/12494804/helping-the-gc-in-mono-droid-using-mvvmcross
[4] https://greghackles.com/weak-subscription-gotcha-in-mvvmcross/
[5] https://github.com/mvvmcross/mvvmcross/issues/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-garbage-colled
[8] https://www.mvvmcross.com/documentation/advanced/customizing-using-app ir-setup
[9] https://www.spicelogic.com/blog/net-event-handler-memory-reak-16