Sobes.tech
Junior — Middle

Egy entitásban lévő erős hivatkozás memóriaszivárgáshoz vezethet?

sobes.tech MI

Válasz az MI-től

Igen, az iOS-ben az objektumok közötti erős hivatkozások jelenléte memória szivárgáshoz vezethet, különösen akkor, ha ciklikus hivatkozás (retain cycle) alakul ki. Ez akkor fordul elő, amikor két objektum egymást erős hivatkozásokkal tartja fenn, és az ARC rendszer nem tudja felszabadítani őket, mivel mindkettő hivatkozás számlálója nem lesz nulla.

Az ilyen szivárgások megelőzése érdekében gyenge (weak) vagy tulajdon nélküli (unowned) hivatkozásokat használnak, amelyek nem növelik a hivatkozás számlálót, és lehetővé teszik a ciklus megszakítását.

Példa ciklikus hivatkozásra:

class Person {
    var apartment: Apartment?
}

class Apartment {
    var tenant: Person?
}

let person = Person()
let apartment = Apartment()
person.apartment = apartment
apartment.tenant = person // itt ciklikus hivatkozás keletkezik

A szivárgás elkerülése érdekében az egyik hivatkozást gyengévé lehet tenni:

class Apartment {
    weak var tenant: Person?
}