Hogyan történik a memória felszabadítása ciklikus hivatkozásokkal rendelkező objektumok esetén a kezelt környezetekben?
sobes.tech MI
Válasz az MI-től
Kezelt környezetekben, mint például az iOS ARC (Automatikus Hivatkozásszámlálás) esetén, a ciklikus hivatkozásokkal rendelkező objektumok memória felszabadítása nem történik automatikusan, mivel az ARC nem képes megszakítani a hivatkozási ciklusokat.
A problémát azzal lehet megoldani, hogy gyenge (weak) és tulajdon nélküli (unowned) hivatkozásokat használunk, amelyek nem növelik az objektum hivatkozási számlálóját. Ez lehetővé teszi a ciklusok megszakítását és a memória helyes felszabadítását.
Példa:
class Person {
var name: String
weak var apartment: Apartment? // gyenge hivatkozás
init(name: String) {
self.name = name
}
}
class Apartment {
let unit: String
unowned let tenant: Person // tulajdon nélküli hivatkozás
init(unit: String, tenant: Person) {
self.unit = unit
self.tenant = tenant
}
}
Itt a Person és az Apartment egymásra hivatkozik, de az egyik hivatkozás gyenge, ez megakadályozza a memória szivárgását.
Ha a hivatkozási ciklusokat nem szüntetik meg, az objektumok a memóriában maradnak, még akkor is, ha külső hivatkozás nincs, ami memória szivárgáshoz vezet.