Sobes.tech
Middle

Mi a különbség a szemétgyűjtő (garbage collector) és az automatik memória kezelés (ARC) között?

sobes.tech MI

Válasz az MI-től

A szemétgyűjtő automatikusan megtalálja és felszabadítja a program által már nem használt memóriát. Háttérben működik, időszakosan átvizsgálva a halmazt és azonosítva azokat az objektumokat, amelyekhez nincs aktív hivatkozás.

ARC (Automatikus Referenciaszámlálás) Swiftben és Objective-C-ben kezeli az objektumok életciklusát azzal, hogy számolja az erős hivatkozások számát minden objektumra. Amint az erős hivatkozások száma nullára csökken, az ARC automatikusan felszabadítja az adott objektum által foglalt memóriát.

Fő különbségek:

Jellemző Szemétgyűjtő ARC
Működési elv Elérhetetlen objektumok keresése Erős hivatkozások számlálása
Felszabadítás ideje Nem determinisztikus, szkennelés közben Determinisztikus, amikor a számláló 0 lesz
Kiegészítő költségek Szünetek a program végrehajtásában (gyűjtés közben) Minimális, a számláló változásakor
Előrejelzés Alacsony Magas
Ciklikus hivatkozások Külön megközelítést igényelnek (pl. gyenge hivatkozások) weak vagy unowned hivatkozások használata szükséges
Használat iOS-en Nem jelenik meg modern Objective-C és Swift környezetben A memória kezelés fő mechanizmusa Objective-C-ben és Swiftben

Példa a weak használatára a ciklikus erős hivatkozások megelőzésére ARC-ben:

class Person {
    let name: String
    var apartment: Apartment? // erős hivatkozás

    init(name: String) {
        self.name = name
        print("\(name) inicializálva")
    }
    deinit {
        print("\(name) deinitializálva")
    }
}

class Apartment {
    let unit: String
    weak var tenant: Person? // gyenge hivatkozás

    init(unit: String) {
        self.unit = unit
        print("Lakás \(unit) inicializálva")
    }
    deinit {
        print("Lakás \(unit) deinitializálva")
    }
}

var john: Person?
var unit4A: Apartment?

john = Person(name: "John Appleseed")
unit4A = Apartment(unit: "4A")

john!.apartment = unit4A
unit4A!.tenant = john // gyenge hivatkozás megakadályozza a ciklust

john = nil // A Person objektum deinitializálódik
unit4A = nil // Az Apartment objektum deinitializálódik