Sobes.tech
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 nil lesz 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.