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ą.