Home Arrow Icon Knowledge base Arrow Icon Global Arrow Icon Was sind die Unterschiede zwischen der Verwendung von Schwachreferenz und Strongreference bei mvvmcross


Was sind die Unterschiede zwischen der Verwendung von Schwachreferenz und Strongreference bei mvvmcross


In MVVMCross ist wie in anderen Frameworks die Wahl zwischen der Verwendung von Schwachempfänger und Strongreference von entscheidender Bedeutung für die Verwaltung des Speichers und zur Verhinderung von Speicherlecks. Hier finden Sie eine detaillierte Erklärung der Unterschiede und der Art und Weise, wie sie sich im Kontext von mvvmcross anwenden:

Starke Referenzen

** Starke Referenzen sind die Standardtyp der Referenz in den meisten Programmiersprachen, einschließlich C#. Wenn ein Objekt stark verwiesen wird, kann der Müllsammler es erst sammeln, wenn alle starken Verweise auf das Objekt entfernt werden. Dies bedeutet, dass es im Gedächtnis bleibt, solange es mindestens einen starken Hinweis auf ein Objekt gibt.

In MVVMCross können starke Referenzen zu Speicherlecks führen, wenn sie nicht ordnungsgemäß verwaltet werden. Wenn beispielsweise ein ViewModel einen starken Hinweis auf eine Ansicht hat und die Ansicht auch einen starken Hinweis auf das ViewModel enthält, wird ein Rückhalteszyklus erstellt. Dies verhindert, dass beide Objekte Müll gesammelt werden, auch wenn sie nicht mehr benötigt werden.

Schwache Referenzen

** Schwache Referenzen ermöglichen es dem Müllsammler andererseits, das referenzierte Objekt zu sammeln, wenn keine starken Referenzen vorhanden sind. Dies ist besonders nützlich in Szenarien, in denen Sie zulassen möchten, dass ein Objekt Müll erfasst wird, wenn es nicht mehr benötigt wird, aber dennoch zugreifen möchten, wenn es zufällig verfügbar ist.

Bei MVVMCross wird die Verwendung schwacher Referenzen ermutigt, die Zyklen zwischen ViewModels und Ansichten zu vermeiden. Anstatt ein ViewModel -Referenzverweis auf eine Ansicht zu haben, können Sie beispielsweise eine schwache Referenz oder ein Messaging -System verwenden, um zwischen ihnen zu kommunizieren. Dies stellt sicher, dass die Aussicht Müll erfasst werden kann, wenn er nicht mehr benötigt wird, auch wenn das ViewModel noch vorhanden ist.

Praktisches Beispiel in mvvmcross

Betrachten Sie ein Szenario, in dem ein ViewModel eine Ansicht benachrichtigen muss, wenn einige Daten geladen werden. Ein allgemeiner Ansatz ist die Verwendung eines Ereignisses im ViewModel, das die Ansicht abonniert. Wenn die Ansicht jedoch stark für dieses Ereignis abonniert wird, wird vom ViewModel zurück zur Ansicht eine starke Referenz erzeugt, die verhindern kann, dass die Ansicht müll gesammelt wird.

Um dies zu vermeiden, stellt MVVMCROSS Methoden wie "WeapsubScribe" bereit, mit denen die Ansicht die Ereignisse des ViewModel schwach abonniert werden kann. Auf diese Weise enthält das ViewModel keinen starken Hinweis auf die Ansicht und verhindert Speicherlecks.

Richtlinien für die Verwendung schwacher Referenzen in mvvmcross

- Verwenden Sie schwache Referenzen für Ansichten: Wenn ein ViewModel mit einer Ansicht interagieren muss, verwenden Sie schwache Referenzen oder Messaging -Systeme, um die Zyklen zu vermeiden.
- Vermeiden Sie starke Verweise auf Ansichten: Stellen Sie sicher, dass ViewModels keine starken Hinweise auf Ansichten enthalten, damit Ansichten Müll gesammelt werden können, wenn sie nicht mehr benötigt werden.
- Messaging -Systeme verwenden: Verwenden Sie Messaging -Systeme wie "IMVXMessger" von MVVMCross, um zwischen ViewModels und Ansichten zu kommunizieren, ohne starke Referenzen zu erzeugen.

Durch die Befolgung dieser Richtlinien können Sie den Speicher in mvvmcross -Anwendungen effektiv verwalten und häufig auftretende Probleme wie Speicherlecks verhindern.

Zitate:
[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_mvm_breaking_retainer_cycle_between/
[5] https://stackoverflow.com/questions/40966271/weak-reference--stong-reference
[6] https://langdev.stackexchange.com/questions/1351/Approaches-for-implementing-weak-references
[7] https://putridparrot.com/blog/weakreferences-inet/
[8] http://java-latte.blogspot.com/2014/07/diffferenz-between-strongreference-weakreference-softreference-phantomreferenference-java.html