Sobes.tech
Middle

V čom spočíva rozdiel medzi zberačom odpadu (garbage collector) a automatickým riadením pamäte (ARC)?

sobes.tech AI

Odpoveď od AI

Automatický zberač odpadu automaticky nachádza a uvoľňuje pamäť, ktorá už nie je používaná programom. Funguje na pozadí, periodicky skenuje haldu a identifikuje objekty, na ktoré neexistujú aktívne odkazy.

ARC (Automatic Reference Counting) v Swift a Objective-C riadi životnosť objektov počítaním počtu silných odkazov na každý objekt. Keď počet silných odkazov na objekt dosiahne nulu, ARC automaticky uvoľní pamäť obsadenú týmto objektom.

Hlavné rozdiely:

Funkcia Zberač odpadu ARC
Princíp práce Vyhľadávanie nedosiahnuteľných objektov Počítanie silných odkazov
Moment uvoľnenia Nedeterministický, pri skenovaní Deterministický, pri 0 odkazoch
Náklady na overhead Pauzy pri vykonávaní programu (pri zbere) Malé, pri zmene počtu odkazov
Predvídateľnosť Nízka Vysoká
Cyklické odkazy Vyžadujú špeciálne prístupy (napr. slabé odkazy) Vyžadujú použitie weak alebo unowned odkazov
Použitie v iOS Nie je dostupné v modernom Objective-C a Swift Hlavný mechanizmus správy pamäti v Objective-C a Swift

Príklad použitia weak na zabránenie cyklu silných odkazov v ARC:

class Person {
    let name: String
    var apartment: Apartment? // silný odkaz

    init(name: String) {
        self.name = name
        print("\(name) sa inicializuje")
    }
    deinit {
        print("\(name) sa deinitializuje")
    }
}

class Apartment {
    let unit: String
    weak var tenant: Person? // slabý odkaz

    init(unit: String) {
        self.unit = unit
        print("Apartment \(unit) sa inicializuje")
    }
    deinit {
        print("Apartment \(unit) sa deinitializuje")
    }
}

var john: Person?
var unit4A: Apartment?

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

john!.apartment = unit4A
unit4A!.tenant = john // slabý odkaz zabraňuje cyklu držania

john = nil // objekt Person sa deinitializuje
unit4A = nil // objekt Apartment sa deinitializuje