Sobes.tech
Middle

Πώς αποθηκεύονται οι προβολές που είναι τύπος αναφοράς;

sobes.tech AI

Απάντηση από AI

Οι προβολές (UIView και οι υποκλάσεις της) στο iOS είναι κλάσεις, δηλαδή τύποι αναφοράς. Η αποθήκευση αναφορών σε αυτές γίνεται μέσω των ακόλουθων μηχανισμών:

  1. Ισχυρές αναφορές (Strong References):

    • Από προεπιλογή, αν δηλώσετε μια ιδιότητα για το UIView χωρίς τον προσδιοριστή weak ή unowned, δημιουργεί μια ισχυρή αναφορά.
    • Μια ισχυρή αναφορά αυξάνει τον μετρητή αναφορών του αντικειμένου. Το αντικείμενο δεν θα διαγραφεί από τη μνήμη όσο υπάρχει τουλάχιστον μια ισχυρή αναφορά σε αυτό.
    • Αυτή είναι η τυπική μέθοδος αποθήκευσης των προβολών, όταν απαιτείται να παραμένουν στη μνήμη και να είναι προσβάσιμες.
    //Ισχυρή αναφορά
    var myView: UIView = UIView()
    
  2. Αδύναμες αναφορές (Weak References):

    • Δηλώνονται με τη λέξη-κλειδί weak.
    • Μια αδύναμη αναφορά δεν αυξάνει τον μετρητή αναφορών του αντικειμένου.
    • Οι αδύναμες αναφορές δεν εμποδίζουν τη διαγραφή του αντικειμένου από τη μνήμη αν δεν υπάρχουν άλλες ισχυρές αναφορές.
    • Χρησιμοποιούνται για την αποφυγή κυκλικών αναφορών, μια τυπική κατάσταση είναι η σχέση γονέα-παιδιού, όπου ο γονέας έχει μια ισχυρή αναφορά στο παιδί, και το παιδί μερικές φορές μπορεί να έχει μια αναφορά στον γονέα. Σε αυτή την περίπτωση, η αντίστροφη αναφορά στον γονέα πρέπει να είναι αδύναμη.
    • Οι αδύναμες αναφορές πρέπει να είναι προαιρετικές (Optional), καθώς το αντικείμενο μπορεί να διαγραφεί και η αναφορά θα γίνει nil.
    weak var parentView: UIView?
    
  3. Ανεξάρτητες αναφορές (Unowned References):

    • Δηλώνονται με τη λέξη-κλειδί unowned.
    • Όπως και οι αδύναμες αναφορές, δεν αυξάνουν τον μετρητή αναφορών.
    • Διαφορά: σε αντίθεση με τις αδύναμες αναφορές, οι ανεξάρτητες αναφορές δεν είναι προαιρετικές. Υποθέτουν ότι το αντικείμενο θα ζήσει τουλάχιστον όσο και η αναφορά σε αυτό. Η πρόσβαση στο αντικείμενο μετά την απελευθέρωσή του θα προκαλέσει σφάλμα (crash).
    • Χρησιμοποιούνται όταν είστε βέβαιοι ότι ο κύκλος ζωής της αναφοράς δεν υπερβαίνει τον κύκλο ζωής του αντικειμένου στο οποίο αναφέρεται. Στο πλαίσιο των προβολών, αυτό είναι λιγότερο συνηθισμένο από το weak.
    //Λιγότερο τυπικό για προβολές, αλλά πιθανό
    unowned var childView: UIView
    
  4. Αθροίσματα και Συλλογές:

    • Η αποθήκευση αναφορών σε προβολές σε πίνακες (Array), λεξικά (Dictionary) ή σύνολα (Set) δημιουργεί επίσης, κατά κανόνα, ισχυρές αναφορές στα στοιχεία της συλλογής.
    var subviews: [UIView] = []
    

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