Middle
Πώς αποθηκεύονται οι προβολές που είναι τύπος αναφοράς;
sobes.tech AI
Απάντηση από AI
Οι προβολές (UIView και οι υποκλάσεις της) στο iOS είναι κλάσεις, δηλαδή τύποι αναφοράς. Η αποθήκευση αναφορών σε αυτές γίνεται μέσω των ακόλουθων μηχανισμών:
-
Ισχυρές αναφορές (Strong References):
- Από προεπιλογή, αν δηλώσετε μια ιδιότητα για το UIView χωρίς τον προσδιοριστή
weakήunowned, δημιουργεί μια ισχυρή αναφορά. - Μια ισχυρή αναφορά αυξάνει τον μετρητή αναφορών του αντικειμένου. Το αντικείμενο δεν θα διαγραφεί από τη μνήμη όσο υπάρχει τουλάχιστον μια ισχυρή αναφορά σε αυτό.
- Αυτή είναι η τυπική μέθοδος αποθήκευσης των προβολών, όταν απαιτείται να παραμένουν στη μνήμη και να είναι προσβάσιμες.
//Ισχυρή αναφορά var myView: UIView = UIView() - Από προεπιλογή, αν δηλώσετε μια ιδιότητα για το UIView χωρίς τον προσδιοριστή
-
Αδύναμες αναφορές (Weak References):
- Δηλώνονται με τη λέξη-κλειδί
weak. - Μια αδύναμη αναφορά δεν αυξάνει τον μετρητή αναφορών του αντικειμένου.
- Οι αδύναμες αναφορές δεν εμποδίζουν τη διαγραφή του αντικειμένου από τη μνήμη αν δεν υπάρχουν άλλες ισχυρές αναφορές.
- Χρησιμοποιούνται για την αποφυγή κυκλικών αναφορών, μια τυπική κατάσταση είναι η σχέση γονέα-παιδιού, όπου ο γονέας έχει μια ισχυρή αναφορά στο παιδί, και το παιδί μερικές φορές μπορεί να έχει μια αναφορά στον γονέα. Σε αυτή την περίπτωση, η αντίστροφη αναφορά στον γονέα πρέπει να είναι αδύναμη.
- Οι αδύναμες αναφορές πρέπει να είναι προαιρετικές (
Optional), καθώς το αντικείμενο μπορεί να διαγραφεί και η αναφορά θα γίνειnil.
weak var parentView: UIView? - Δηλώνονται με τη λέξη-κλειδί
-
Ανεξάρτητες αναφορές (Unowned References):
- Δηλώνονται με τη λέξη-κλειδί
unowned. - Όπως και οι αδύναμες αναφορές, δεν αυξάνουν τον μετρητή αναφορών.
- Διαφορά: σε αντίθεση με τις αδύναμες αναφορές, οι ανεξάρτητες αναφορές δεν είναι προαιρετικές. Υποθέτουν ότι το αντικείμενο θα ζήσει τουλάχιστον όσο και η αναφορά σε αυτό. Η πρόσβαση στο αντικείμενο μετά την απελευθέρωσή του θα προκαλέσει σφάλμα (crash).
- Χρησιμοποιούνται όταν είστε βέβαιοι ότι ο κύκλος ζωής της αναφοράς δεν υπερβαίνει τον κύκλο ζωής του αντικειμένου στο οποίο αναφέρεται. Στο πλαίσιο των προβολών, αυτό είναι λιγότερο συνηθισμένο από το
weak.
//Λιγότερο τυπικό για προβολές, αλλά πιθανό unowned var childView: UIView - Δηλώνονται με τη λέξη-κλειδί
-
Αθροίσματα και Συλλογές:
- Η αποθήκευση αναφορών σε προβολές σε πίνακες (
Array), λεξικά (Dictionary) ή σύνολα (Set) δημιουργεί επίσης, κατά κανόνα, ισχυρές αναφορές στα στοιχεία της συλλογής.
var subviews: [UIView] = [] - Η αποθήκευση αναφορών σε προβολές σε πίνακες (
Η επιλογή μεταξύ ισχυρής, αδύναμης ή ανεξάρτητης αναφοράς εξαρτάται από το συγκεκριμένο σενάριο χρήσης και τη διαχείριση του κύκλου ζωής των αντικειμένων, για την αποφυγή διαρροών μνήμης. Στο SwiftUI, οι έννοιες διαχείρισης κύκλου ζωής των προβολών είναι διαφορετικές, αλλά στο πλαίσιο του UIKit, αυτοί οι μηχανισμοί παραμένουν ο κύριος τρόπος αποθήκευσης αναφορών.