Sobes.tech
Junior — Middle

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

sobes.tech AI

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

Στο iOS, για τύπους αναφοράς (π.χ. κλάσεις), η μνήμη κατανεμόταν δυναμικά στη στοίβα (heap). Όταν δημιουργείται ένα αντικείμενο κλάσης, το σύστημα του αναθέτει μνήμη στη στοίβα και επιστρέφει μια αναφορά σε αυτό το αντικείμενο.

Η απελευθέρωση μνήμης γίνεται μέσω αυτόματης καταμέτρησης αναφορών (ARC — Automatic Reference Counting). Κάθε αντικείμενο διατηρεί έναν μετρητή αναφορών — τον αριθμό ενεργών αναφορών σε αυτό. Όταν δημιουργείται μια νέα αναφορά, ο μετρητής αυξάνεται, και όταν η αναφορά διαγράφεται ή γίνεται nil, μειώνεται. Όταν ο μετρητής φτάσει το μηδέν, το αντικείμενο διαγράφεται αυτόματα από τη μνήμη.

Παράδειγμα:

class Person {
    var name: String
    init(name: String) {
        self.name = name
    }
}

var person1: Person? = Person(name: "Иван") // μετρητής αναφορών = 1
var person2 = person1 // μετρητής αναφορών = 2
person1 = nil // μετρητής αναφορών = 1
person2 = nil // μετρητής αναφορών = 0, το αντικείμενο Person διαγράφεται από τη μνήμη

Έτσι, ο προγραμματιστής δεν χρειάζεται να ελευθερώσει χειροκίνητα τη μνήμη — το ARC το διαχειρίζεται αυτόματα.