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 είναι μια αδύναμη αναφορά, επομένως δεν δημιουργείται κύκλος και τα αντικείμενα απελευθερώνονται σωστά από τον συλλέκτη απορριμμάτων.