Το αδύναμο πρότυπο συμβάντων και τα κλασικά γεγονότα στο MVVMCROSS (ή οποιοδήποτε πλαίσιο .NET) εξυπηρετούν διαφορετικούς σκοπούς και έχουν ξεχωριστές υλοποιήσεις, που στοχεύουν κυρίως στη διαχείριση διαρροών μνήμης και σε διάρκεια ζωής αντικειμένων.
κλασικές εκδηλώσεις
Τα κλασικά γεγονότα στο .NET βασίζονται σε ισχυρές αναφορές. Όταν ένα αντικείμενο προσυπογράφει ένα συμβάν ενός άλλου αντικειμένου, δημιουργείται μια ισχυρή αναφορά από την πηγή συμβάντος στον συνδρομητή. Αυτό σημαίνει ότι εφόσον η πηγή συμβάντος αναφέρεται στον συνδρομητή, ο συνδρομητής δεν μπορεί να συλλεχθεί σκουπίδια, ακόμη και αν δεν χρειάζεται πλέον ή αναφέρεται σε άλλα μέρη της αίτησης. Αυτό μπορεί να οδηγήσει σε διαρροές μνήμης εάν ο συνδρομητής δεν είναι ρητά μη καταγραφής από το συμβάν όταν δεν χρειάζεται πλέον.
Στο MVVMCROSS, τα κλασικά γεγονότα μπορούν να χρησιμοποιηθούν για επικοινωνία μεταξύ των προβολών και των προβολών, αλλά απαιτούν προσεκτική διαχείριση για να αποφευχθούν διαρροές μνήμης. Για παράδειγμα, εάν το ViewModel εκθέτει ένα συμβάν και μια προβολή προσυπογράψει σε αυτό, το ViewModel θα κρατήσει μια ισχυρή αναφορά στην άποψη, εμποδίζοντας το να συλλεχθεί σκουπίδια μέχρι να αφαιρεθεί ρητά η συνδρομή.
αδύναμο μοτίβο συμβάντων
Το αδύναμο πρότυπο συμβάντων έχει σχεδιαστεί για να αποτρέψει διαρροές μνήμης χρησιμοποιώντας αδύναμες αναφορές αντί για ισχυρές. Όταν ένας συνδρομητής χρησιμοποιεί ένα αδύναμο μοτίβο συμβάντων για να εγγραφεί σε ένα συμβάν, η πηγή συμβάντος κατέχει μια αδύναμη αναφορά στον συνδρομητή. Αυτό επιτρέπει στον συνδρομητή να συλλέγεται σκουπίδια εάν δεν αναφέρεται πλέον σε άλλα μέρη της εφαρμογής, ακόμη και αν δεν έχει ρητά μη καταργηθεί από την εκδήλωση.
Στο MVVMCROSS, η χρήση αδύναμων γεγονότων μπορεί να βοηθήσει στη διατήρηση μιας καθαρής αρχιτεκτονικής, εξασφαλίζοντας ότι τα ViewModels δεν έχουν ισχυρές αναφορές στις απόψεις. Αυτό είναι ιδιαίτερα σημαντικό στις εφαρμογές κινητής τηλεφωνίας όπου η διαχείριση της μνήμης είναι κρίσιμη. Το MVVMCROSS παρέχει επεκτάσεις όπως το `HEADSubScribe 'για τη διευκόλυνση της χρήσης αδύναμων γεγονότων, επιτρέποντας στους προγραμματιστές να εγγραφούν σε συμβάντα χωρίς να δημιουργούν ισχυρές αναφορές που θα μπορούσαν να οδηγήσουν σε διαρροές μνήμης.
Εφαρμογή και οφέλη
Η εφαρμογή αδύναμων γεγονότων συνήθως περιλαμβάνει τη δημιουργία ενός προσαρμοσμένου μηχανισμού για τη διαχείριση των συνδρομών χρησιμοποιώντας αντικείμενα «ασθενούς». Αυτή η προσέγγιση εξασφαλίζει ότι οι συνδρομητές μπορούν να συλλέγονται σκουπίδια εάν δεν χρειάζονται πλέον, μειώνοντας τον κίνδυνο διαρροής μνήμης. Ωστόσο, εισάγει επίσης πρόσθετη πολυπλοκότητα και μια μικρή απόδοση επιβάρυνσης λόγω της ανάγκης ελέγχου εάν οι συνδρομητές είναι ακόμα ζωντανοί πριν καλέσουν τους χειριστές των εκδηλώσεών τους.
μειονεκτήματα και σκέψεις
Ενώ το αδύναμο πρότυπο συμβάντος είναι ευεργετικό για την πρόληψη διαρροών μνήμης, έχει κάποια μειονεκτήματα. Μπορεί να είναι πιο περίπλοκο για την εφαρμογή από τα κλασικά γεγονότα και υπάρχει κίνδυνος αντικειμένων συνδρομητών "zombie" που δεν χρησιμοποιούνται πλέον, αλλά δεν έχουν ακόμη συλλεχθεί σκουπίδια. Εάν εκτελεστεί ένα συμβάν και εκτελείται ένας χειριστής συνδρομητή ζόμπι, μπορεί να οδηγήσει σε απροσδόκητη συμπεριφορά ή σφάλματα.
Συνοπτικά, το αδύναμο μοτίβο συμβάντων στο MVVMCROSS διαφέρει από τα κλασικά γεγονότα χρησιμοποιώντας αδύναμες αναφορές για να αποτρέψει τη διαρροή μνήμης και να επιτρέψει στους συνδρομητές να συλλέγονται πιο εύκολα τα σκουπίδια. Παρόλο που προσφέρει σημαντικά οφέλη όσον αφορά τη διαχείριση της μνήμης, απαιτεί προσεκτική εφαρμογή και εξέταση πιθανών μειονεκτημάτων.
Αναφορές:[1] https://stackoverflow.com/a/19379912
[2] http://stackoverflow.com/questions/30848118/capturing-the-onexit-event-in-wf-with-mvvmcross/31784453
[3] https://www.reactiveui.net/vs/mvvmcross
[4] https://mustafacanyucel.com/blog/blog-22.html
[5] https://ladimolnar.com/2015/09/14/the-weak-event-pattern-is-dangerous/
[6] https://www.mvvmcross.com/mvvmcross-6.0.0-release/
[7] https://yanxiaodi.gitbook.io/xamarin-mvvmcross-handbook/using-mvvmcross-to-create-your-first-xamarin-app/navigation/responding-the-events-from-diferent-controls
[8] https://www.devleader.ca/2024/02/14/weak-events-in-c-how-to-avoid-nasty-memory-leaks
[9] https://learn.microsoft.com/en-us/dotnet/desktop/wpf/events/weak-event-patterns?view=netdesktop-9.0
[10] https://www.mvvmcross.com/documentation/fundamentals/navigation
[11] https://www.mvvmcross.com/documentation/fundamentals/viewmodel-lifecycle
[12] https://stackoverflow.com/questions/13788787/when-to-use-weak-events