Sobes.tech
Middle

Kuo skiriasi šiukšlių rinkėjas (garbage collector) nuo automatinės atminties valdymo (ARC)?

sobes.tech AI

Atsakymas iš AI

Automatinis atminties surinkėjas automatiškai suranda ir atlaisvina atmintį, kuri nebenaudojama programos. Jis veikia foniniame režime, periodiškai skenuodamas krūvą ir identifikuodamas objektus, į kuriuos nėra aktyvių nuorodų.

ARC (Automatic Reference Counting) Swift ir Objective-C valdo objektų gyvavimą skaičiuodamas stiprių nuorodų skaičių kiekvienam objektui. Kai stiprių nuorodų skaičius pasiekia nulį, ARC automatiškai atlaisvina tą objektą užimančią atmintį.

Pagrindiniai skirtumai:

Savybė Atminties surinkėjas ARC
Darbo principas Nedarbingų objektų paieška Stiprių nuorodų skaičiavimas
Atlaisvinimo momentas Nedirbantis, skenavimo metu Nedarbinis, kai nuorodų skaičius 0
Išlaidos Pertraukimai programos vykdyme Mažos, keičiant skaitiklį
Prognozuojamumas Žemas Aukštas
Ciklinės nuorodos Reikalauja specialių metodų (pvz., silpnos nuorodos) Reikalauja weak arba unowned nuorodų
Naudojimas iOS'e Nėra prieinama šiuolaikiniame Objective-C ir Swift Pagrindinis atminties valdymo mechanizmas Objective-C ir Swift

Pavyzdys, kaip naudoti weak, siekiant išvengti stiprių nuorodų ciklo ARC:

class Person {
    let name: String
    var apartment: Apartment? // stipri nuoroda

    init(name: String) {
        self.name = name
        print("\(name) inicijuojamas")
    }
    deinit {
        print("\(name) deinicijuojamas")
    }
}

class Apartment {
    let unit: String
    weak var tenant: Person? // silpna nuoroda

    init(unit: String) {
        self.unit = unit
        print("Apartment \(unit) inicijuojamas")
    }
    deinit {
        print("Apartment \(unit) deinicijuojamas")
    }
}

var john: Person?
var unit4A: Apartment?

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

john!.apartment = unit4A
unit4A!.tenant = john // silpna nuoroda išvengia ciklo

john = nil // Person objektas deinicijuojamas
unit4A = nil // Apartment objektas deinicijuojamas