Sobes.tech
Junior — Middle

Hogyan történik a memória felszabadítása ciklikus hivatkozásokkal rendelkező objektumok esetén a kezelt környezetekben?

sobes.tech MI

Válasz az MI-től

Kezelt környezetekben, mint például az iOS ARC (Automatikus Hivatkozásszámlálás) esetén, a ciklikus hivatkozásokkal rendelkező objektumok memória felszabadítása nem történik automatikusan, mivel az ARC nem képes megszakítani a hivatkozási ciklusokat.

A problémát azzal lehet megoldani, hogy gyenge (weak) és tulajdon nélküli (unowned) hivatkozásokat használunk, amelyek nem növelik az objektum hivatkozási számlálóját. Ez lehetővé teszi a ciklusok megszakítását és a memória helyes felszabadítását.

Példa:

class Person {
    var name: String
    weak var apartment: Apartment? // gyenge hivatkozás

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

class Apartment {
    let unit: String
    unowned let tenant: Person // tulajdon nélküli hivatkozás

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

Itt a Person és az Apartment egymásra hivatkozik, de az egyik hivatkozás gyenge, ez megakadályozza a memória szivárgását.

Ha a hivatkozási ciklusokat nem szüntetik meg, az objektumok a memóriában maradnak, még akkor is, ha külső hivatkozás nincs, ami memória szivárgáshoz vezet.