Ναι, το εργαλείο γραφήματος μνήμης στο XCode μπορεί να βοηθήσει στην αναγνώριση των κύκλων διατήρησης σε εφαρμογές MVVMCross. Δείτε πώς λειτουργεί και πώς μπορεί να εφαρμοστεί στο MVVMCross:
Κατανόηση των κύκλων διατήρησης
Η διατήρηση των κύκλων εμφανίζονται όταν δύο ή περισσότερα αντικείμενα διατηρούνται ισχυρές αναφορές μεταξύ τους, εμποδίζοντας τους να προκληθούν από τη μνήμη. Αυτό είναι ένα κοινό ζήτημα στην ανάπτυξη του iOS, ειδικά όταν χρησιμοποιείτε εκπροσώπους ή κλεισίματα που καταγράφουν αντικείμενα έντονα.
Χρήση του εργαλείου γραφήματος μνήμης
1. Εκτέλεση της εφαρμογής και λήψη στιγμιότυπων: Για να χρησιμοποιήσετε το εργαλείο γραφήματος μνήμης, εκτελέστε την εφαρμογή MVVMCROSS σε Xcode και περιηγηθείτε στις βασικές της ροές. Πάρτε στιγμιότυπα μνήμης σε διαφορετικά σημεία, ειδικά μετά την πλοήγηση μακριά από τις απόψεις ή την προβολή μοντέλων που πρέπει να προκληθούν.
2. Αναλύοντας στιγμιότυπα: Στο πρόγραμμα εντοπισμού σφαλμάτων γραφήματος μνήμης, ο αριστερός πίνακας εμφανίζει όλα τα αντικείμενα που βρίσκονται στη μνήμη, μαζί με τις περιπτώσεις τους. Αναζητήστε αντικείμενα που θα έπρεπε να έχουν διαμορφωθεί, αλλά εξακολουθούν να υπάρχουν. Η αύξηση του αριθμού των περιπτώσεων μιας τάξης με την πάροδο του χρόνου μπορεί να υποδηλώνει έναν κύκλο συγκράτησης.
3. Προσδιορισμός κύκλων διατήρησης: Επιλέξτε ένα αντικείμενο στο αριστερό πλαίσιο για να δείτε το γράφημα αντικειμένων του. Το γράφημα δείχνει τις αναφορές που διατηρούν το αντικείμενο στη μνήμη. Οι έντονες γραμμές υποδεικνύουν ισχυρές αναφορές, ενώ οι ανοιχτό γκρι γραμμές υποδεικνύουν άγνωστες αναφορές (οι οποίες θα μπορούσαν να είναι αδύναμες ή ισχυρές). Εάν βλέπετε έναν βρόχο όπου τα αντικείμενα αναφέρονται ο ένας τον άλλον έντονα, είναι πιθανό ένας κύκλος συγκράτησης.
4. Διορθώσεις κύκλων διατήρησης: Μόλις εντοπίσετε έναν κύκλο συγκράτησης, ελέγξτε τον κωδικό σας για να βρείτε πού δημιουργούνται οι ισχυρές αναφορές. Συχνά, αυτό συνεπάγεται την αλλαγή ισχυρών αναφορών σε αδύναμες αναφορές, ειδικά σε αντιπροσώπους ή κλεισίματα.
Εφαρμογή στο MVVMCROSS
Στις εφαρμογές MVVMCross, τα μοντέλα προβολής συνδέονται στενά με τον κύκλο ζωής των απόψεων. Αυτό μπορεί μερικές φορές να οδηγήσει στη διατήρηση των κύκλων εάν δεν διαχειρίζεται σωστά. Για παράδειγμα, εάν ένα μοντέλο προβολής έχει μια ισχυρή αναφορά σε μια άποψη και η θέα έχει επίσης μια ισχυρή αναφορά στο μοντέλο προβολής (ίσως μέσω μιας δέσμευσης), μπορεί να συμβεί ένας κύκλος συγκράτησης.
Για να αποφευχθεί αυτό στο MVVMCross, βεβαιωθείτε ότι οι αναφορές από τις απόψεις σε μοντέλα είναι αδύναμες. Χρησιμοποιήστε τις μεθόδους κύκλου ζωής που παρέχεται από το MVVMCROSS (όπως το `εξαφανισμένο ') για να καθαρίσετε τυχόν ισχυρές αναφορές όταν απορρίπτονται οι προβολές. Επιπλέον, χρησιμοποιήστε το εργαλείο γραφήματος μνήμης για να επαληθεύσετε ότι τα μοντέλα προβολής θεωρούνται σωστά όταν οι σχετικές απόψεις τους αφαιρούνται από τη στοίβα πλοήγησης.
Παράδειγμα αναγνώρισης κύκλων διατήρησης στο MVVMCROSS
Ας υποθέσουμε ότι έχετε ένα `myviewmodel` που είναι δεσμευμένο σε ένα` myview '. Εάν το "MyView` κρατάει μια ισχυρή αναφορά στο" MyViewModel` και το "MyViewModel` κρατά επίσης μια ισχυρή αναφορά στο" MyView` (ίσως μέσω ενός εκπροσώπου ή ενός κλεισίματος), θα δείτε και τα δύο αντικείμενα να παραμένουν στη μνήμη ακόμη και μετά την πλοήγηση μακριά από το "MyView`. Χρησιμοποιώντας το εργαλείο γραφήματος μνήμης, θα προσδιορίσετε αυτόν τον κύκλο και στη συνέχεια θα τροποποιήσετε τον κωδικό σας για να χρησιμοποιήσετε αδύναμες αναφορές όπου χρειάζεται.
Ακολουθώντας αυτά τα βήματα και χρησιμοποιώντας το εργαλείο γραφήματος μνήμης, μπορείτε να εντοπίσετε και να επιλύσετε αποτελεσματικά τους κύκλους διατήρησης στις εφαρμογές MVVMCROSS, διασφαλίζοντας ότι η χρήση της μνήμης της εφαρμογής σας παραμένει αποτελεσματική και σταθερή.
Αναφορές:[1] https://doordash.engineering/2019/05/22/ios-memory-leaks-and-reretain-cycle-detection-using-xcodes-memory-graph-debugger/
[2] https://careersatdoordash.com/blog/ios-memory-leaks-andain-cycle-detection-using-xcodes-memory-graph-debugger/
[3] https://www.tothenew.com/blog/memory-leak-with-memory-graph-debugger/
[4] https://paul-samuels.com/blog/2018/11/20/unit-testing-retain-cycles/
[5] https://www.mvvmcross.com/mvvmcross-5-release/
[6] https://stackoverflow.com/questions/54040726/mvvmcross-android-appears-to-be-keep-hold-of-viewmodels-and-never-disposing-w
[7] https://www.donnywals.com/using-xcodes-memory-graph-to-find-memory-leaks/
[8] https://www.mvvmcross.com/mvvmcross-6.0.0-release/
[9] https://stackoverflow.com/questions/41660486/knowing-where-retain-cycles-are-and-removing-them