V MVVMCROSS, rovnako ako v iných rámcoch, je výber medzi použitím slabej a silnosti rozhodujúci pre správu pamäte a prevenciu úniku pamäte. Tu je podrobné vysvetlenie rozdielov a toho, ako sa uplatňujú v kontexte MVVMCross:
Silné referencie
** Silné referencie sú predvoleným typom referencie vo väčšine programovacích jazykov vrátane C#. Ak sa objekt dôrazne odkazuje, zberateľ odpadu ho nemôže zbierať, kým sa neodstránia všetky silné odkazy na objekt. To znamená, že pokiaľ existuje aspoň jeden silný odkaz na objekt, zostane v pamäti.
V MVVMCross môžu silné referencie viesť k úniku pamäte, ak nie sú správne spravované. Napríklad, ak má ViewModel silný odkaz na pohľad a pohľad má tiež silný odkaz na ViewModel, vytvorí sa cyklus udržiavania. To bráni obom objektom, aby sa zbierali odpadky, aj keď už nie sú potrebné.
Slabé referencie
** Na druhej strane slabé odkazy umožňujú zberateľovi odpadu zbierať referenčný objekt, ak neexistujú žiadne silné odkazy. Toto je užitočné najmä v scenároch, v ktorých chcete povoliť, aby bol predmet zozbieraný, ak už nie je potrebný, ale ak je to k dispozícii, napriek tomu k nemu chcete získať prístup.
V MVVMcross sa odporúča používanie slabých odkazov, aby sa predišlo udržaniu cyklov medzi pohľadmi a výhľadmi. Napríklad namiesto toho, aby ste si dôrazne odkazovali na pohľad na pohľad, môžete na komunikáciu medzi nimi použiť slabú referenciu alebo systém správ. To zaisťuje, že výhľad môže byť zhromaždený, keď už nie je potrebný, aj keď stále existuje.
Praktický príklad v MVVMcross
Zoberme si scenár, v ktorom potrebuje viewModel upozorniť na načítanie niektorých údajov. Bežným prístupom je použitie udalosti v pohľade Model, ku ktorému sa pohľad predplatí. Ak sa však zobrazenie dôrazne prihlási k tejto udalosti, vytvorí silnú referenciu z ViewModel späť do pohľadu, ktorý môže zabrániť zhromaždeniu odpadu.
Aby sa tomu zabránilo, MVVMCross poskytuje metódy ako „slabýSubscribe“, čo umožňuje slabo prihlásiť sa na odber udalostí ViewModel. ViewModel týmto spôsobom nedrží silný odkaz na pohľad, čím bráni úniku pamäte.
Pokyny na použitie slabých odkazov v MVVMCross
- Použite slabé referencie pre zobrazenia: Ak viewmodel potrebuje interakciu s pohľadom, použite slabé referencie alebo systémy zasielania správ, aby ste predišli udržaniu cyklov.
- Vyhnite sa silným odkazom na zobrazenia: Uistite sa, že pohľady na pohľady nemajú silné odkazy na názory, aby sa umožnili odhalenie odpadu, keď už nie sú potrebné.
- Používajte systémy na zasielanie správ: Zvážte používanie systémov správ, ako je MVVMCross's `IMVXMessenger`, na komunikáciu medzi ViewModels and Views bez vytvorenia silných odkazov.
Podľa týchto pokynov môžete efektívne spravovať pamäť v aplikáciách MVVMCross a zabrániť bežným problémom, ako sú úniky pamäte.
Citácie:[1] https://stackoverflow.com/a/19379912
[2] https://forums.swift.org/t/unowned-references-have-more-wor-cenhead-han-pong-references/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-reference
[6] https://langdev.stackexchange.com/questions/1351/approaches-for-implementing-weak-references
[7] https://putridParrot.com/blog/weakreferences-in-net/
[8] http://java-latte.blogspot.com/2014/07/difference-between-prongreference-weakreference-softreference-phantomreference-in-java.html