Sobes.tech
Middle

V čem spočívá rozdíl mezi sběračem odpadků (garbage collector) a automatickým řízením paměti (ARC)?

sobes.tech AI

Odpověď od AI

Sběrač odpadu automaticky najde a uvolní paměť, kterou již program nepoužívá. Funguje na pozadí, periodicky prohledává haldu a identifikuje objekty, na které již nejsou aktivní odkazy.

ARC (Automatické počítání odkazů) v Swift a Objective-C spravuje životnost objektů tím, že počítá počet silných odkazů na každý objekt. Jakmile počet silných odkazů na objekt klesne na nulu, ARC automaticky uvolní paměť obsazenou tímto objektem.

Hlavní rozdíly:

Vlastnost Sběrač odpadu ARC
Princip fungování Vyhledávání nedostupných objektů Počítání silných odkazů
Moment uvolnění Nedefinovaný, při skenování Deterministický, při 0 odkazech
Dodatečné náklady Pauzy při běhu programu (při sběru) Minimální, při změně počítadla
Předvídatelnost Nízká Vysoká
Cyklické odkazy Vyžadují speciální přístupy (například slabé odkazy) Vyžadují použití weak nebo unowned odkazů
Použití v iOS Chybí v moderním Objective-C a Swift Hlavní mechanismus správy paměti v Objective-C a Swift

Příklad použití weak k prevenci cyklů silných odkazů v ARC:

class Person {
    let jméno: String
    var byt: Apartment? // silný odkaz

    init(jméno: String) {
        self.jméno = jméno
        print("\(jméno) je inicializováno")
    }
    deinit {
        print("\(jméno) je deinitializováno")
    }
}

class Apartment {
    let jednotka: String
    weak var nájemník: Person? // slabý odkaz

    init(jednotka: String) {
        self.jednotka = jednotka
        print("Byt \(jednotka) je inicializován")
    }
    deinit {
        print("Byt \(jednotka) je deinitializován")
    }
}

var john: Person?
var jednotka4A: Apartment?

john = Person(jméno: "John Appleseed")
jednotka4A = Apartment(jednotka: "4A")

john!.byt = jednotka4A
jednotka4A!.nájemník = john // slabý odkaz zabraňuje cyklu

john = nil // Objekt Person je deinitializován
jednotka4A = nil // Objekt Apartment je deinitializován