Hogyan történik a memória felszabadítása a referencia típusú objektumok esetén?
sobes.tech MI
Válasz az MI-től
iOS-en a referencia típusokkal (például Swift vagy Objective-C osztályok) létrehozott objektumokat az automatikus hivatkozásszámlálás (ARC — Automatic Reference Counting) rendszer kezeli. Minden objektum tárol egy hivatkozásszámlálót — az aktív hivatkozások számát. Amikor új hivatkozás jön létre az objektumra, a számláló növekszik, és amikor a hivatkozás már nem használatos (például, egy változó kilép a hatókörből vagy nil értékre állítódik), a számláló csökken.
Amikor egy objektum hivatkozásszámlálója eléri a nullát, az azt jelenti, hogy már senki sem hivatkozik rá, és az objektum által foglalt memória automatikusan felszabadul. Ez segít elkerülni a memória szivárgásokat manuális kezelés nélkül.
Swift példában:
class Person {
var name: String
init(name: String) {
self.name = name
}
deinit {
print("Person \(name) felszabadult")
}
}
var p1: Person? = Person(name: "Ivan")
var p2 = p1 // a hivatkozásszám növekedett
p1 = nil // a számláló csökkent, de az objektum még él
p2 = nil // a számláló 0, az objektum felszabadult
Fontos elkerülni a ciklikus hivatkozásokat (retain cycles), amikor két objektum egymásra hivatkozik, ami megakadályozza a memória felszabadulását. Ehhez weak vagy unowned hivatkozásokat használnak.