MVVMCross zaisťuje zber odpadu pre predplatné udalosti predovšetkým pomocou slabých odkazov. Tu je podrobné vysvetlenie toho, ako to funguje:
Prehľad MVVMCross Messenger
Doplnok MVVMCross Messenger je navrhnutý tak, aby uľahčil agregáciu udalostí medzi komponentmi. Umožňuje komponentom komunikovať publikovaním a prihlásením sa na odber správ. Messenger používa slabé referencie pre predplatné udalostí, čo pomáha predchádzať úniku pamäte tým, že umožní zberateľovi odpadu odstrániť objekty, na ktoré sa už nie sú uvedené.
Slabé referencie v MVVMcross
Keď sa prihlásite na odber správy pomocou MVVMCross Messenger, môžete určiť, či použiť slabú alebo silnú referenciu. V predvolenom nastavení MVVMCross používa pre predplatné slabé referencie (`mvxreference.weak`). To znamená, že Messenger nedrží silný odkaz na metódu spätného volania, čo umožňuje zberateľovi odpadu odstrániť predplatné, ak objekt, ktorý sa predplatil, vynechá z rozsahu.
Predplatné a zrušenie
Predplatné je možné spravovať pomocou niekoľkých metód:
- Prihláste sa na odber: Správy sa odovzdávajú priamo do publikačného vlákna.
- Predbežné odbory: Správy sú zhrnuté do hlavného vlákna používateľského rozhrania.
- PodpriptiononThreadPoolThread: Správy sú zaradené do frontu na spracovanie fondu vlákien.
Každá metóda predplatného vracia `mvxSubscriptionToken`, ktorá sa dá použiť na zrušenie odberu zo správy. Ak však token nie je uložený, predplatné môže byť okamžite zhromaždené odpadky.
Mechanizmus zberu odpadu
Mechanizmus zberu odpadu v MVVMcross sa spolieha na to, že `mvxsubscriptToken` je zbieraný odpad, keď sa vynechá z rozsahu. Ak nie je uložený token predplatného, bude mať nárok na zbierku odpadu, čo môže viesť k odbaveniu obsluhy udalostí. Tento prístup zaisťuje, že objekty nie sú zbytočne udržiavané v pamäti kvôli predplatnému udalosti.
Pozorovanie stavu predplatného
MVVMCross tiež poskytuje metódy na pozorovanie aktuálneho stavu predplatného, ako napríklad „Hassubscriptionsfor` a` CountSubscriptionsfor`. Okrem toho Messenger publikuje správy „mvxsubscriberChangeMessage“ vždy, keď sa predplatné pridajú, odstránia alebo vyprší, čo umožňuje komponentom prispôsobiť svoje správanie na základe súčasného stavu predplatného.
Osvedčené postupy pre správu pamäte
Zabezpečiť efektívne zbery odpadu a zabrániť úniku pamäte:
- Vždy, keď je to možné, použite slabé referencie pre predplatné udalostí.
- Uložte tokeny predplatného, ak potrebujete explicitne spravovať predplatné.
- Odhláste sa od udalostí, keď už nie sú potrebné, najmä ak používate silné odkazy.
- Vyhnite sa udržiavaniu silných odkazov na objekty, ktoré by sa mali zbierať odpadky, ako sú modely alebo pohľady na zobrazenie.
Dodržiavaním týchto praktík a využitím slabého mechanizmu predplatného spoločnosti MVVMCross môžu vývojári pomôcť zabezpečiť, aby predplatné udalostí nezabránili zhromažďovaniu odpadu, čím sa zachováva efektívne riadenie pamäte vo svojich aplikáciách.
Citácie:[1] https://www.mvvmcross.com/documentation/plugins/messenger
[2] https://stackoverflow.com/questions/39315395/mvvmcross-best-way-o-raise-aise-event-in-viewModel
[3] https://stackoverflow.com/questions/12494804/helping-the-gc-in-ono-droid-using-using-mvvmcross
[4] https://gregshackles.com/weak-subscription-gotcha-in-mvvvmcross/
[5] https://github.com/mvvmcross/mvvmcross/issues/2145
[6] https://livebook.manning.com/book/xamarin-in-action/b-using-mvvmlight-instead-of-mvvvmcross/v-15/
[7] https://stackoverflow.com/questions/30798429/mvvmcross-android-viewmodel-never-garbage-collected
[8] https://www.mvvmcross.com/documentation/advanced/custoughising-using-app-and-setup
[9] https://www.spicelogic.com/blog/net-event-andler-memory-leak-16