Home Arrow Icon Knowledge base Arrow Icon Global Arrow Icon Πώς το MVVMCROSS εξασφαλίζει συλλογή σκουπιδιών για συνδρομές συμβάντων


Πώς το MVVMCROSS εξασφαλίζει συλλογή σκουπιδιών για συνδρομές συμβάντων


Το MVVMCROSS εξασφαλίζει τη συλλογή σκουπιδιών για συνδρομές συμβάντων κυρίως μέσω της χρήσης ασθενών αναφορών. Ακολουθεί μια λεπτομερής εξήγηση για το πώς λειτουργεί:

Επισκόπηση του mvvmcross messenger

Το plugin MVVMCROSS Messenger έχει σχεδιαστεί για να διευκολύνει τη συγκέντρωση συμβάντων μεταξύ των στοιχείων. Επιτρέπει στα στοιχεία να επικοινωνούν με τη δημοσίευση και την εγγραφή σε μηνύματα. Ο αγγελιοφόρος χρησιμοποιεί αδύναμες αναφορές για συνδρομές συμβάντων, οι οποίες βοηθούν στην πρόληψη διαρροών μνήμης, επιτρέποντας στον συλλέκτη σκουπιδιών να αφαιρέσει αντικείμενα που δεν αναφέρονται πλέον.

αδύναμες αναφορές στο mvvmcross

Όταν εγγραφείτε σε ένα μήνυμα χρησιμοποιώντας το MVVMCROSS Messenger, μπορείτε να καθορίσετε εάν θα χρησιμοποιήσετε μια αδύναμη ή ισχυρή αναφορά. Από προεπιλογή, το MVVMCROSS χρησιμοποιεί αδύναμες αναφορές (`mvxreference.weak ') για συνδρομές. Αυτό σημαίνει ότι ο αγγελιοφόρος δεν έχει ισχυρή αναφορά στη μέθοδο επανάκλησης, επιτρέποντας στον συλλέκτη σκουπιδιών να αφαιρέσει τη συνδρομή εάν το αντικείμενο που έχει εγγραφεί βγαίνει από το πεδίο εφαρμογής.

Συνδρομή και μη επιγραφή

Οι συνδρομές μπορούν να αντιμετωπιστούν χρησιμοποιώντας διάφορες μεθόδους:
- Εγγραφή: Τα μηνύματα μεταφέρονται απευθείας στο νήμα δημοσίευσης.
- SubscribeonMainThread: Τα μηνύματα κατατάσσονται στο κύριο νήμα UI.
- SubscribeonthReadPoolThread: Τα μηνύματα αναφέρονται στην ουρά για την επεξεργασία της πισίνας.

Κάθε μέθοδος συνδρομής επιστρέφει ένα `mvxsubscriptionToken`, το οποίο μπορεί να χρησιμοποιηθεί για να διαγραφεί από το μήνυμα. Ωστόσο, εάν το διακριτικό δεν αποθηκεύεται, η συνδρομή μπορεί να συλλεχθεί αμέσως.

Μηχανισμός συλλογής σκουπιδιών

Ο μηχανισμός συλλογής σκουπιδιών στο MVVMCROSS βασίζεται στο «MVXSubscriptionToken» που συλλέγονται σκουπίδια που συλλέγονται όταν βγαίνει από το πεδίο εφαρμογής. Εάν δεν αποθηκευτεί ένα συμβολικό συμβόλαιο, θα είναι επιλέξιμο για συλλογή σκουπιδιών, η οποία μπορεί να οδηγήσει στην αποστολή του χειριστή συμβάντων. Αυτή η προσέγγιση εξασφαλίζει ότι τα αντικείμενα δεν διατηρούνται στη μνήμη άσκοπα λόγω συνδρομών συμβάντων.

Παρατηρώντας την κατάσταση συνδρομής

Το MVVMCROSS παρέχει επίσης μεθόδους για την παρακολούθηση της τρέχουσας κατάστασης συνδρομής, όπως το `hassubscriptionsfor 'και το` countsubscriptionsfor'. Επιπλέον, ο Messenger δημοσιεύει μηνύματα `mvxsubscribeRchangemessage 'όποτε προστίθενται, αφαιρούνται ή εξελίσσονται συνδρομές, επιτρέποντας στα εξαρτήματα να προσαρμόσουν τη συμπεριφορά τους με βάση την τρέχουσα κατάσταση συνδρομής.

Βέλτιστες πρακτικές για τη διαχείριση μνήμης

Για να εξασφαλιστεί η αποτελεσματική συλλογή σκουπιδιών και να αποτρέψετε διαρροές μνήμης:
- Χρησιμοποιήστε αδύναμες αναφορές για συνδρομές συμβάντων όποτε είναι δυνατόν.
- Αποθηκεύστε τα μάρκες συνδρομής εάν χρειάζεστε ρητά τις συνδρομές.
- Καταργήστε την εγγραφή σας από τα γεγονότα όταν δεν χρειάζονται πλέον, ειδικά εάν χρησιμοποιείτε ισχυρές αναφορές.
- Αποφύγετε να διατηρείτε ισχυρές αναφορές σε αντικείμενα που θα πρέπει να συλλέγονται σκουπίδια, όπως μοντέλα προβολής ή προβολές.

Ακολουθώντας αυτές τις πρακτικές και αξιοποιώντας τον αδύναμο μηχανισμό συνδρομής του MVVMCross, οι προγραμματιστές μπορούν να βοηθήσουν στη διασφάλιση ότι οι συνδρομές συμβάντων δεν εμποδίζουν τα αντικείμενα να συλλέγονται σκουπίδια, διατηρώντας έτσι την αποτελεσματική διαχείριση της μνήμης στις εφαρμογές τους.

Αναφορές:
[1] https://www.mvvmcross.com/documentation/plugins/messenger
[2] https://stackoverflow.com/questions/39315395/mvvmcross-best-way-to-raise-event-in-viewmodel
[3] https://stackoverflow.com/questions/12494804/helping-the-gc-in-mono-droid-using-mvvmcross
[4] https://gregshackles.com/weak-subscription-gotcha-in-mvvmcross/
[5] https://github.com/mvvmcross/mvvmcross/issues/2145
[6] https://livebook.manning.com/book/xamarin-in-action/b-using-mvvm-light-instead-of-mvvmcross/v-15/
[7] https://stackoverflow.com/questions/30798429/mvvmcross-android-viewmodel-never-garbage-collected
[8] https://www.mvvmcross.com/documentation/advanced/customizing-using-app-and-setup
[9] https://www.spicelogic.com/blog/net-event-handler-memory-leak-16