Sobes.tech
Middle

Come viene gestita la memoria per i tipi di riferimento in Swift?

sobes.tech AI

Risposta dell'AI

In Swift, la gestione della memoria per i tipi di riferimento (classi) avviene tramite il conteggio automatico delle referenze (ARC, Automatic Reference Counting). Ogni oggetto nell'heap mantiene un contatore di riferimenti: il numero di riferimenti attivi a quell'oggetto. Quando viene creata una nuova referenza a un oggetto, il contatore aumenta, e quando la referenza smette di essere usata, diminuisce. Quando il contatore raggiunge zero, l'oggetto viene automaticamente rimosso dalla memoria.

Esempio:

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

var a: Person? = Person(name: "Alice") // contatore = 1
var b = a                             // contatore = 2
b = nil                              // contatore = 1
a = nil                              // contatore = 0, oggetto eliminato

È importante evitare cicli di riferimenti (retained cycles), quando due oggetti si riferiscono reciprocamente, impedendo il rilascio della memoria. A tal fine, si usano riferimenti deboli (weak) e senza proprietario (unowned).

I tipi di valore (strutture, enumerazioni) sono memorizzati nello stack e copiati durante l'assegnazione, quindi ARC non si applica a essi.