MVVMCross zajišťuje sběr odpadků pro předplatné události především pomocí slabých odkazů. Zde je podrobné vysvětlení, jak to funguje:
Přehled mvvmcross messenger
Plugin MVVMCross Messenger je navržen tak, aby usnadnil agregaci událostí mezi komponenty. Umožňuje komponentům komunikovat publikováním a předplatím zpráv. Messenger používá slabé odkazy pro předplatné události, což pomáhá předcházet únikům paměti tím, že umožňuje kolektoru odpadků odstranit objekty, na které se již nejsou odkazovány.
Slabé odkazy v mvvmcross
Když se přihlásíte k odběru zprávy pomocí MVVMCross Messenger, můžete zadat, zda použít slabý nebo silný odkaz. Ve výchozím nastavení používá MVVMCross pro předplatné slabé reference (`mvxreference.weak`). To znamená, že Messenger nedrží silný odkaz na metodu zpětného volání, což umožňuje sběrateli odpadků odstranit předplatné, pokud se objekt předplaceným odběru vynořuje z rozsahu.
Předplatné a odhlášení
Předplatné lze spravovat pomocí několika metod:
- Přihlásit se k odběru: Zprávy jsou předávány přímo na publikační vlákno.
- PŘIPOMÍNKACEMAINTHREAD: Zprávy jsou zařazeny do hlavního vlákna uživatelského rozhraní.
- PŘIPOJENÍ PŘIPRAVITOSTITONTHREADPOOLTHREAD: Zprávy jsou pro zpracování fondů vlákna ve frontě.
Každá metoda předplatného vrací `mvxSubScriptionToken`, kterou lze použít k odhlášení ze zprávy. Pokud však token není uložen, může být předplatné okamžitě shromážděno odpadky.
Mechanismus sběru odpadků
Mechanismus sběru odpadu v MVVMCrossu spoléhá na to, že se odpadky shromáždí, když vyjde z rozsahu. Pokud není uložen token předplatného, bude způsobilý pro sběr odpadků, což může vést k odhlášení obsluhy události. Tento přístup zajišťuje, že objekty nejsou v paměti zbytečně kvůli předplatnému události.
Pozorování stavu předplatného
MVVMCross také poskytuje metody pro pozorování aktuálního stavu předplatného, jako jsou `hassubscriptionsfor` a` počítá v souladu. Kromě toho zveřejňuje Messenger zprávy `mvxSubsCriberChangeMageSage`, kdykoli jsou přidány předplatné, odstraněny nebo vyprší, což umožňuje komponentám přizpůsobit jejich chování na základě současného stavu předplatného.
osvědčené postupy pro správu paměti
Pro zajištění efektivního sběru odpadků a zabránění úniku paměti:
- Kdykoli je to možné, použijte slabé odkazy na předplatné události.
- Ukládejte tokeny předplatného, pokud potřebujete explicitně spravovat předplatné.
- Odhlášení z událostí, když již nejsou potřeba, zejména pokud používají silné reference.
- Vyvarujte se udržování silných odkazů na objekty, které by měly být shromažďovány odpadky, jako jsou modely pohledu nebo pohledy.
Dodržováním těchto praktik a využitím slabého mechanismu předplatného MVVMCrossu mohou vývojáři pomoci zajistit, aby předplatné událostí nezabránily objektům v shromažďování odpadků, čímž si ve svých aplikacích udržují efektivní správu paměti.
Citace:[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-action/b-using-mvvm-light-instead-of-mvvmcross/v-15/
[7] https://stackoverflow.com/questions/30798429/mvvmcross-ndroid-viewModel-ne-garbage-conleted
[8] https://www.mvvmcross.com/documentation/advanced/customizing-using-app-and-setup
[9] https://www.spiceLogic.com/blog/net-event-mandler-memory-leak-16