Sobes.tech
Junior — Middle

Cum se eliberează memoria pentru obiectele cu referințe ciclice în mediile gestionate?

sobes.tech AI

Răspuns de la AI

În mediile gestionate, cum ar fi iOS cu ARC (Numărarea Automată a Referințelor), eliberarea memoriei pentru obiectele cu referințe ciclice nu are loc automat, deoarece ARC nu poate întrerupe ciclurile de referințe.

Pentru a rezolva această problemă, se folosesc referințe slabe (weak) și fără deținător (unowned), care nu cresc contorul de referințe al obiectului. Acest lucru permite întreruperea ciclurilor și eliberarea corectă a memoriei.

Exemplu:

class Person {
    var name: String
    weak var apartment: Apartment? // referință slabă

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

class Apartment {
    let unit: String
    unowned let tenant: Person // referință fără deținător

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

Aici, Person și Apartment se referă reciproc, dar una dintre referințe este slabă, prevenind scurgerile de memorie.

Dacă ciclurile de referințe nu sunt întrerupte, obiectele vor rămâne în memorie în ciuda lipsei referințelor externe, ceea ce duce la scurgeri de memorie.