Junior — Middle
Ar įmanoma, kad susidarytų cikliniai nuorodai, trukdantys automatinės atminties valdytojo surinkimui?
sobes.tech AI
Atsakymas iš AI
Taip, iOS naudojant automatinį atminties valdymą (ARC), gali atsirasti cikliniai nuorodų (retain cycles). Tai įvyksta, kai du ar daugiau objektų vienas kitą laiko stipriomis nuorodomis, kas neleidžia nuorodų skaitikliui pasiekti nulį ir objektai nėra atlaisvinami.
Siekiant išvengti tokių situacijų, naudojamos silpnos (weak) arba be savininko (unowned) nuorodos. Pavyzdžiui, delegatai dažnai deklaruojami kaip weak, kad būtų išvengta ciklų.
Pavyzdys:
class Person {
var apartment: Apartment?
}
class Apartment {
weak var tenant: Person? // silpna nuoroda, išvengianti ciklo
}
let john = Person()
let unit4A = Apartment()
john.apartment = unit4A
unit4A.tenant = john
Šiame pavyzdyje, tenant yra silpna nuoroda, todėl ciklas nesusidaro, ir objektai teisingai atlaisvinami surinkėjo.