Sobes.tech
Junior — Middle

Είναι πιθανό να προκύψουν κυκλικές αναφορές που εμποδίζουν τη συλλογή απορριμμάτων στον αυτόματο διαχειριστή μνήμης;

sobes.tech AI

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

Ναι, στο iOS, κατά τη χρήση της αυτόματης διαχείρισης μνήμης (ARC), μπορεί να προκύψει δημιουργία κυκλικών αναφορών (retain cycles). Αυτό συμβαίνει όταν δύο ή περισσότερα αντικείμενα διατηρούν το ένα το άλλο με ισχυρές αναφορές, με αποτέλεσμα ο μετρητής αναφορών να μην φτάνει στο μηδέν και τα αντικείμενα να μην απελευθερώνονται.

Για να αποφευχθούν τέτοιες καταστάσεις, χρησιμοποιούνται αδύναμες (weak) ή χωρίς ιδιοκτήτη (unowned) αναφορές. Για παράδειγμα, οι αντιπρόσωποι δηλώνονται συνήθως ως weak για να αποτρέψουν κυκλικές αναφορές.

Παράδειγμα:

class Person {
    var apartment: Apartment?
}

class Apartment {
    weak var tenant: Person?  // αδύναμη αναφορά για αποτροπή κύκλου
}

let john = Person()
let unit4A = Apartment()
john.apartment = unit4A
unit4A.tenant = john

Σε αυτό το παράδειγμα, το tenant είναι μια αδύναμη αναφορά, επομένως δεν δημιουργείται κύκλος και τα αντικείμενα απελευθερώνονται σωστά από τον συλλέκτη απορριμμάτων.