W MVVMCROSS, podobnie jak w innych frameworkach, wybór między użyciem słabego a silnego jest kluczowy dla zarządzania pamięcią i zapobieganiem wyciekom pamięci. Oto szczegółowe wyjaśnienie różnic i ich zastosowania w kontekście MVVMCROSS:
Silne odniesienia
** Silne odniesienia są domyślnym rodzajem odniesienia w większości języków programowania, w tym C#. Gdy obiekt jest mocno odwoływany, śmieci nie może go zebrać, dopóki wszystkie silne odniesienia do obiektu nie zostaną usunięte. Oznacza to, że dopóki istnieje co najmniej jedno silne odniesienie do obiektu, pozostanie on w pamięci.
W MVVMCROSS silne odniesienia mogą prowadzić do wycieków pamięci, jeśli nie są odpowiednio zarządzane. Na przykład, jeśli ViewModel ma silne odniesienie do widoku, a widok ma również silne odniesienie do ViewModel, powstaje cykl zachowania. Zapobiega to zbieraniu śmieci obu przedmiotów, nawet jeśli nie są już potrzebne.
słabe odniesienia
** Z drugiej strony słabe odniesienia pozwalają poborowi śmieci zebranie obiektu odwołanego, jeśli nie istnieją żadne silne odniesienia. Jest to szczególnie przydatne w scenariuszach, w których chcesz pozwolić na zbieranie śmieci, jeśli nie jest już potrzebny, ale nadal chcesz uzyskać do niego dostęp, jeśli jest dostępny.
W MVVMCROSS zachęca się do uniknięcia słabych odniesień do unikania cykli między Modelami Viewdels i Widokiem. Na przykład, zamiast mieć silne odniesienie do widoku, możesz użyć słabego odniesienia lub systemu przesyłania wiadomości do komunikacji między nimi. Zapewnia to, że widok może być zebrany śmieci, gdy nie jest już potrzebny, nawet jeśli Wididmodel nadal istnieje.
praktyczny przykład w mvvmcross
Rozważ scenariusz, w którym ViewModel musi powiadomić widok, gdy niektóre dane są załadowane. Częstym podejściem jest użycie zdarzenia w ViewModel, które wyświetla widok. Jeśli jednak widok zdecydowanie zasubskrybuje to zdarzenie, tworzy silne odniesienie od ViewModel z powrotem do widoku, co może uniemożliwić pobieraniu śmieci.
Aby tego uniknąć, MVVMCROSS zapewnia metody takie jak `` SubsubScribe`, co pozwala na słabe zasubskrybowanie zdarzeń ViewModel. W ten sposób ViewModel nie ma silnego odniesienia do widoku, zapobiegając wyciekom pamięci.
Wytyczne dotyczące stosowania słabych odniesień w MVVMCROSS
- Użyj słabych odniesień do widoków: Gdy ViewModel musi wchodzić w interakcje z widokiem, użyj słabych odniesień lub systemów przesyłania wiadomości, aby uniknąć zachowania cykli.
- Unikaj silnych odniesień do widoków: Upewnij się, że ViewModels nie posiadają silnych odniesień do widoków, aby umożliwić zbieranie śmieci, gdy nie są już potrzebne.
- Użyj systemów przesyłania wiadomości: Rozważ użycie systemów przesyłania wiadomości, takich jak MVVMCROSS `IMVXMESSENGER`, aby komunikować się między ViewModels i widokami bez tworzenia silnych odniesień.
Postępując zgodnie z niniejszymi wytycznymi, możesz skutecznie zarządzać pamięcią w aplikacjach MVVMCROSS i zapobiegać powszechnymi problemami, takimi jak wycieki pamięci.
Cytaty:[1] https://stackoverflow.com/a/19379912
[2] https://forums.swift.org/t/unowned-references-have-more-overhead-than-strong-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-strong-reference
[6] https://langdev.stackexchange.com/questions/1351/approaches-for-implementing-weak-references
[7] https://putridparrot.com/blog/weakreferences-n-net/
[8] http://java-latte.blogspot.com/2014/07/difference-between-strongreference freakreference-Softreference-phantomreference-in-Java.html