Sobes.tech
Middle — Middle+

Πώς αρχικοποιείται ο κύκλος διατήρησης αναφορών στις διαχειριζόμενες από μνήμη γλώσσες προγραμματισμού;

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?  // αδύναμη αναφορά για αποφυγή κύκλου
}

Έτσι, το κύκλωμα διατήρησης ξεκινά μέσω αμοιβαίων ισχυρών αναφορών, και αποτρέπεται με τη χρήση αδύναμων ή ασφαλών αναφορών για να διακόψει τον κύκλο.