Πώς αρχικοποιείται ο κύκλος διατήρησης αναφορών στις διαχειριζόμενες από μνήμη γλώσσες προγραμματισμού;
sobes.tech AI
Απάντηση από AI
Σε γλώσσες προγραμματισμού με αυτόματη διαχείριση μνήμης, όπως η Swift ή η Objective-C στο iOS, το κύκλωμα διατήρησης (retain cycle) συμβαίνει όταν δύο ή περισσότερα αντικείμενα διατηρούν το ένα το άλλο μέσω ισχυρών αναφορών, με αποτέλεσμα ο συλλέκτης απορριμμάτων ή το ARC (Αυτόματη Καταμέτρηση Αναφορών) να μην μπορεί να απελευθερώσει αυτά τα αντικείμενα.
Το κύκλωμα διατήρησης ξεκινά όταν, για παράδειγμα, το αντικείμενο A περιέχει μια ισχυρή αναφορά στο αντικείμενο B, και το αντικείμενο B με τη σειρά του περιέχει μια ισχυρή αναφορά στο αντικείμενο A. Αυτό οδηγεί σε αριθμητές αναφορών και των δύο αντικειμένων που ποτέ δεν γίνονται μηδέν.
Για την αποτροπή τέτοιων κύκλων, χρησιμοποιούνται:
- Αδύναμες αναφορές (
weak) — δεν αυξάνουν τον αριθμητή αναφορών και ρυθμίζονται αυτόματα σε nil όταν το αντικείμενο διαγράφεται. - Ασφαλείς αναφορές (
unowned) — δεν αυξάνουν τον αριθμητή, αλλά δεν ρυθμίζονται αυτόματα σε nil, και χρησιμοποιούνται όταν διασφαλίζεται ότι το αντικείμενο θα υπάρχει περισσότερο.
Παράδειγμα:
class Person {
var apartment: Apartment?
}
class Apartment {
weak var tenant: Person? // αδύναμη αναφορά για αποφυγή κύκλου
}
Έτσι, το κύκλωμα διατήρησης ξεκινά μέσω αμοιβαίων ισχυρών αναφορών, και αποτρέπεται με τη χρήση αδύναμων ή ασφαλών αναφορών για να διακόψει τον κύκλο.