Sobes.tech
Junior — Middle

Come viene liberata la memoria degli oggetti con riferimenti ciclici negli ambienti gestiti?

sobes.tech AI

Risposta dell'AI

In ambienti gestiti come iOS con ARC (Contatore di Riferimento Automatico), il rilascio della memoria per oggetti con riferimenti ciclici non avviene automaticamente, poiché ARC non può interrompere i cicli di riferimenti.

Per risolvere questo problema, si utilizzano riferimenti deboli (weak) e senza proprietario (unowned), che non aumentano il contatore di riferimenti dell'oggetto. Questo permette di interrompere i cicli e liberare correttamente la memoria.

Esempio:

class Person {
    var name: String
    weak var apartment: Apartment? // riferimento debole

    init(name: String) {
        self.name = name
    }
}

class Apartment {
    let unit: String
    unowned let tenant: Person // riferimento senza proprietario

    init(unit: String, tenant: Person) {
        self.unit = unit
        self.tenant = tenant
    }
}

Qui, Person e Apartment si riferiscono reciprocamente, ma uno dei riferimenti è debole, prevenendo perdite di memoria.

Se i cicli di riferimenti non vengono interrotti, gli oggetti rimarranno in memoria nonostante l'assenza di riferimenti esterni, portando a perdite di memoria.