V MVVMCrossu, stejně jako v jiných rámcích, je volba mezi používáním slabé reference a silnou referencí zásadní pro správu paměti a zabránění úniku paměti. Zde je podrobné vysvětlení rozdílů a toho, jak se používají v souvislosti s MVVMCross:
Silné reference
** Silné odkazy jsou výchozí typ reference ve většině programovacích jazyků, včetně C#. Když je objekt silně odkazován, sběratel odpadků jej nemůže sbírat, dokud nebudou odstraněny všechny silné odkazy na objekt. To znamená, že pokud existuje alespoň jeden silný odkaz na objekt, zůstane v paměti.
V MVVMCrossu mohou silné reference vést k úniku paměti, pokud nebudou správně zvládnuty. Například, pokud ViewModel má silný odkaz na pohled a pohled také drží silný odkaz na viewModel, vytvoří se cyklus udržení. Tím se zabrání, aby oba objekty byly shromažďovány odpadky, i když již nejsou potřeba.
Slabé reference
** Slabé odkazy na druhé straně umožňují sběrateli odpadu shromažďovat odkazovaný objekt, pokud neexistují žádné silné reference. To je zvláště užitečné ve scénářích, kde chcete povolit, aby se objekt shromáždil, pokud již není potřeba, ale přesto k němu chcete získat přístup, pokud je k dispozici.
V MVVMCrossu se používání slabých odkazů doporučuje, aby se zabránilo zadržování cyklů mezi zobrazeními a názory. Například místo toho, aby se viewModel silně odkazoval na pohled, můžete ke komunikaci mezi nimi použít slabý odkaz nebo systém zasílání zpráv. Tím je zajištěno, že pohled může být shromážděn odpadky, pokud již není potřeba, i když ViewModel stále existuje.
PRAKTICKÝ PŘÍKLAD V MVVMCROSS
Zvažte scénář, ve kterém musí ViewModel informovat pohled, když jsou načtena některá data. Běžným přístupem je použití události v ViewModel, na kterou se zobrazí pohled. Pokud se však zobrazí pohled na tuto událost silně předplatí, vytvoří silný odkaz z ViewModelu zpět k pohledu, což může zabránit tomu, aby se zobrazoval pohledy.
Aby se tomu zabránilo, MVVMCross poskytuje metody jako `slabémsubscribe`, což umožňuje pohledu slabě se přihlásit k odběru událostí ViewModel. Tímto způsobem ViewModel nedrží silný odkaz na pohled, což zabraňuje únikům paměti.
Pokyny pro používání slabých odkazů v MVVMCross
- Použijte slabé odkazy pro pohledy: Když se ViewModel musí interagovat s pohledem, používat slabé odkazy nebo systémy zasílání zpráv, aby se zabránilo udržení cyklů.
- Vyvarujte se silných odkazů na názory: Ujistěte se, že ViewModels nedrží silné odkazy na názory, které umožňují shromažďování názorů, pokud již nejsou potřeba.
- Používejte systémy zasílání zpráv: Zvažte pomocí systémů zasílání zpráv, jako je MVVMCross's `IMVXMessenger` pro komunikaci mezi ViewModels a pohledy bez vytváření silných odkazů.
Dodržováním těchto pokynů můžete efektivně spravovat paměť v aplikacích MVVMCross a zabránit běžným problémům, jako jsou úniky paměti.
Citace:[1] https://stackoverflow.com/a/19379912
[2] https://forums.swift.org/t/unowned-references-more-overhead-than-Strong-reference/72765
[3] https://learn.microsoft.com/en-us/dotnet/standard/garbage-collection/weak-references
[4] https://www.reddit.com/r/swift/comments/8ifwy9/ios_mvvm_breaking_retainer_cycle_between/
[5] https://stackoverflow.com/questions/40966271/weak-reference-and-Strong-reference
[6] https://langdev.stackexchange.com/questions/1351/approaches-for-implementing-weak-reference
[7] https://putridparrot.com/blog/weakreferences-in-net/
[8] http://java-latte.blogspot.com/2014/07/Difference-betweens-Strongreference-weakReference-softreference-Phantomreference-in-java.html