Στο MVVMCROSS, όπως και σε άλλα πλαίσια, η επιλογή μεταξύ της χρήσης των ασθενών και της ισχυρής παραγωγής είναι ζωτικής σημασίας για τη διαχείριση της μνήμης και την πρόληψη των διαρροών μνήμης. Ακολουθεί μια λεπτομερής εξήγηση των διαφορών και πώς ισχύουν στο πλαίσιο του MVVMCROSS:
Ισχυρές αναφορές
** Ισχυρές αναφορές είναι ο προεπιλεγμένος τύπος αναφοράς στις περισσότερες γλώσσες προγραμματισμού, συμπεριλαμβανομένου του C#. Όταν ένα αντικείμενο αναφέρεται έντονα, ο συλλέκτης σκουπιδιών δεν μπορεί να το συλλέξει μέχρι να αφαιρεθούν όλες οι ισχυρές αναφορές στο αντικείμενο. Αυτό σημαίνει ότι εφ 'όσον υπάρχει τουλάχιστον μια ισχυρή αναφορά σε ένα αντικείμενο, θα παραμείνει στη μνήμη.
Στο MVVMCROSS, οι ισχυρές αναφορές μπορούν να οδηγήσουν σε διαρροές μνήμης εάν δεν διαχειριστούν σωστά. Για παράδειγμα, εάν το ViewModel έχει μια ισχυρή αναφορά σε μια άποψη και η θέα έχει επίσης ισχυρή αναφορά στο ViewModel, δημιουργείται ένας κύκλος συγκράτησης. Αυτό εμποδίζει και τα δύο αντικείμενα να συλλέγονται σκουπίδια ακόμη και όταν δεν χρειάζονται πλέον.
αδύναμες αναφορές
** Οι αδύναμες αναφορές, από την άλλη πλευρά, επιτρέπουν στον συλλέκτη σκουπιδιών να συλλέξει το αναφερόμενο αντικείμενο εάν δεν υπάρχουν ισχυρές αναφορές. Αυτό είναι ιδιαίτερα χρήσιμο σε σενάρια όπου θέλετε να επιτρέψετε σε ένα αντικείμενο να συλλεχθεί σκουπίδια εάν δεν είναι πλέον απαραίτητο, αλλά εξακολουθείτε να θέλετε να το έχετε πρόσβαση εάν συμβαίνει να είναι διαθέσιμο.
Στο MVVMCROSS, η χρήση αδύναμων αναφορών ενθαρρύνεται να αποφευχθεί η διατήρηση κύκλων μεταξύ των προβολών και των απόψεων. Για παράδειγμα, αντί να έχετε ένα ViewModel να αναφέρετε έντονα μια άποψη, μπορείτε να χρησιμοποιήσετε μια αδύναμη αναφορά ή ένα σύστημα ανταλλαγής μηνυμάτων για να επικοινωνήσετε μεταξύ τους. Αυτό εξασφαλίζει ότι η θέα μπορεί να συλλεχθεί σκουπίδια όταν δεν χρειάζεται πλέον, ακόμη και αν το ViewModel εξακολουθεί να υπάρχει.
Πρακτικό παράδειγμα στο mvvmcross
Εξετάστε ένα σενάριο όπου ένα ViewModel πρέπει να ειδοποιήσει μια άποψη όταν φορτωθούν ορισμένα δεδομένα. Μια κοινή προσέγγιση είναι να χρησιμοποιηθεί ένα συμβάν στο ViewModel στο οποίο η προβολή προσυπογράφει. Ωστόσο, εάν η προβολή συνδρομείται έντονα σε αυτό το συμβάν, δημιουργεί μια ισχυρή αναφορά από το ViewModel πίσω στην θέα, η οποία μπορεί να αποτρέψει τη συλλογή σκουπιδιών.
Για να αποφευχθεί αυτό, το MVVMCROSS παρέχει μεθόδους όπως το `HeardSubscribe ', το οποίο επιτρέπει την άποψη να εγγραφεί στα γεγονότα του ViewModel. Με αυτόν τον τρόπο, το ViewModel δεν έχει ισχυρή αναφορά στην άποψη, αποτρέποντας τις διαρροές μνήμης.
Οδηγίες για τη χρήση αδύναμων αναφορών στο MVVMCROSS
- Χρησιμοποιήστε αδύναμες αναφορές για προβολές: Όταν ένα ViewModel πρέπει να αλληλεπιδράσει με μια προβολή, χρησιμοποιήστε αδύναμες αναφορές ή συστήματα ανταλλαγής μηνυμάτων για να αποφύγετε τη διατήρηση κύκλων.
- Αποφύγετε ισχυρές αναφορές στις προβολές: Βεβαιωθείτε ότι τα θέατρων δεν διαθέτουν ισχυρές αναφορές στις προβολές που επιτρέπουν τις προβολές να συλλέγονται σκουπίδια όταν δεν χρειάζονται πλέον.
- Χρησιμοποιήστε συστήματα ανταλλαγής μηνυμάτων: Εξετάστε τη χρήση συστημάτων ανταλλαγής μηνυμάτων όπως το `imvxmessenger 'του MVVMCROSS' για να επικοινωνήσετε μεταξύ των προβολών και των προβολών χωρίς να δημιουργήσετε ισχυρές αναφορές.
Ακολουθώντας αυτές τις κατευθυντήριες γραμμές, μπορείτε να διαχειριστείτε αποτελεσματικά τη μνήμη σε εφαρμογές MVVMCROSS και να αποτρέψετε κοινά ζητήματα όπως διαρροές μνήμης.
Αναφορές:[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.stackkexchange.com/questions/1351/approaches-for-eplementing-weak-references
[7] https://putridparrot.com/blog/weakreferences-in-net/
[8] http://java-latte.blogspot.com/2014/07/differed-between-strongreference-weakreference-softreference-phantomreference-in-java.html