Sobes.tech
Junior — Middle

Πώς γίνεται η απελευθέρωση της μνήμης των αντικειμένων που δημιουργούνται με τύπο αναφοράς;

sobes.tech AI

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

Στο iOS, τα αντικείμενα που δημιουργούνται με τύπους αναφοράς (π.χ., κλάσεις σε Swift ή Objective-C) διαχειρίζονται από το σύστημα αυτόματης καταμέτρησης αναφορών (ARC — Automatic Reference Counting). Κάθε αντικείμενο διατηρεί έναν μετρητή αναφορών — τον αριθμό ενεργών αναφορών σε αυτό. Όταν δημιουργείται μια νέα αναφορά στο αντικείμενο, ο μετρητής αυξάνεται, και όταν η αναφορά δεν χρησιμοποιείται πλέον (π.χ., μια μεταβλητή βγαίνει από το πεδίο ορατότητας ή ανατίθεται σε nil), ο μετρητής μειώνεται.

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

Παράδειγμα σε Swift:

class Person {
    var name: String
    init(name: String) {
        self.name = name
    }
    deinit {
        print("Άτομο \(name) απελευθερώθηκε")
    }
}

var p1: Person? = Person(name: "Ivan")
var p2 = p1 // ο μετρητής αναφορών αυξήθηκε
p1 = nil // ο μετρητής μειώθηκε, αλλά το αντικείμενο εξακολουθεί να υπάρχει
p2 = nil // ο μετρητής έφτασε στο 0, το αντικείμενο απελευθερώθηκε

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