Sobes.tech
Junior — Middle

Kaip vyksta atminties išlaisvinimas ciklinėmis nuorodomis turintiems objektams valdomose aplinkose?

sobes.tech AI

Atsakymas iš AI

Valdomose aplinkose, tokios kaip iOS su ARC (Automatinis nuorodų skaitiklis), ciklinės nuorodos turinčių objektų atlaisvinimas neįvyksta automatiškai, nes ARC negali nutraukti nuorodų ciklų.

Sprendžiant šią problemą, naudojamos silpnos (weak) ir be savininko (unowned) nuorodos, kurios nepadidina objekto nuorodų skaitiklio. Tai leidžia nutraukti ciklus ir teisingai atlaisvinti atmintį.

Pavyzdys:

class Person {
    var name: String
    weak var apartment: Apartment? // silpna nuoroda

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

class Apartment {
    let unit: String
    unowned let tenant: Person // be savininko nuoroda

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

Čia, Person ir Apartment nurodo vienas kitą, tačiau viena nuoroda yra silpna, kas užkerta kelią atminties nutekėjimui.

Jei nuorodų ciklai nebus nutraukti, objektai liks atmintyje nepaisant išorinių nuorodų nebuvimo, kas sukels atminties nutekėjimą.