Home Arrow Icon Knowledge base Arrow Icon Global Arrow Icon Jak MVVMCross zajišťuje sběr odpadků pro předplatné události


Jak MVVMCross zajišťuje sběr odpadků pro předplatné události


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