Junior — Middle
Ar stipri nuoroda vienetoje gali sukelti atminties nutekėjimą?
sobes.tech AI
Atsakymas iš AI
Taip, iOS objektų stiprių nuorodų buvimas gali sukelti atminties nutekėjimą, ypač jei susidaro ciklinė nuoroda (retention cycle). Tai vyksta, kai du objektai vienas kitą laiko stipriomis nuorodomis, ir ARC sistema jų laisvinti negali, nes abiejų nuorodų skaitiklis nepasiekia nulio.
Siekiant išvengti tokių nutekėjimų, naudojamos silpnos (weak) arba be savininko (unowned) nuorodos, kurios nepadidina nuorodų skaitiklio ir leidžia nutraukti ciklą.
Ciklinės nuorodos pavyzdys:
class Person {
var apartment: Apartment?
}
class Apartment {
var tenant: Person?
}
let person = Person()
let apartment = Apartment()
person.apartment = apartment
apartment.tenant = person // čia susidaro retencijos ciklas
Norint išvengti nutekėjimo, galima padaryti vieną iš nuorodų silpną:
class Apartment {
weak var tenant: Person?
}