Intern
Mi az a szemétgyűjtő (garbage collector)?
sobes.tech MI
Válasz az MI-től
Az iOS-ben nincs hagyományos szemétgyűjtő. Ehelyett az Automatikus Referenciaszámlálás (ARC) mechanizmusát használják.
- Automatikus mechanizmus: Az ARC automatikusan számolja a szoros hivatkozásokat az objektumokra.
- Memória felszabadítás: Amikor egy objektumhoz tartozó szoros hivatkozások száma nullára csökken, az ARC felszabadítja a lefoglalt memóriát.
- Memóriaszivárgások megelőzése: A szoros, gyenge és nem tulajdonolt (unowned) hivatkozások helyes használata megakadályozza a memóriaszivárgásokat és a szoros hivatkozási ciklusokat.
ARC típusai:
- Szoros (strong): Növeli a hivatkozásszámot. Alapértelmezett.
- Gyenge (weak): Nem növeli a hivatkozásszámot. Automatikusan
nillesz az objektum deallocálásakor. A szoros ciklusok megelőzésére használják. Opcióként van deklarálva. - Nem tulajdonolt (unowned): Nem növeli a hivatkozásszámot. Garantálja, hogy a hivatkozott objektum a nem tulajdonolt hivatkozás teljes életciklusa alatt létezik. Nem opcionális. Akkor használják, ha két objektum kölcsönösen szoros kapcsolatban áll, de az egyiknek rövidebb az életciklusa.
ARC előnyei:
- Előre jelezhetőség: A memória felszabadítása determinisztikus módon történik, amint az objektum már nem használatos.
- Teljesítmény: Nincsenek háttérben futó szemétgyűjtő költségei, amelyek szüneteket okozhatnak.
- Egyszerűség: A fejlesztőnek nem kell manuálisan kezelnie a memóriát a legtöbb esetben, de meg kell értenie a hivatkozásszámlálás alapelveit a szivárgások megelőzése érdekében.
Szoros hivatkozási ciklus példája:
class Person {
let name: String
var apartment: Apartment? // szoros hivatkozás az Apartment-re
init(name: String) { self.name = name }
deinit { print("\(name) deinitializing") }
}
class Apartment {
let unit: String
weak var tenant: Person? // gyenge hivatkozás a Person-re a ciklus megelőzése érdekében
init(unit: String) { self.unit = unit }
deinit { print("Apartment \(unit) deinitializing") }
}
var john: Person?
var unit4A: Apartment?
john = Person(name: "John Appleseed")
unit4A = Apartment(unit: "4A")
john!.apartment = unit4A
unit4A!.tenant = john // A weak használata itt kritikus
john = nil
unit4A = nil
// Weak tenant nélkül: Mind john, mind a unit4A nem kerülnek deinitializálásra.
// Weak tenant-tal: Mind john, mind a unit4A helyesen kerülnek deinitializálásra.