Sobes.tech
Middle

Mis vahe on prügikorjajal (garbage collector) ja automaatse mälu haldamise (ARC) vahel?

sobes.tech AI

Vastus AI-lt

Automaatne mälu kogujaja leiab ja vabastab automaatselt mälu, mida programm enam ei kasuta. Ta töötab taustal, perioodiliselt skaneerides virna ja tuvastades objektid, millele ei ole aktiivseid viiteid.

ARC (Automatic Reference Counting) Swift ja Objective-C haldab objektide elu, lugedes iga objekti tugevate viidete arvu. Kui tugevate viidete arv jõuab nullini, vabastab ARC automaatselt selle objekti poolt kasutatud mälu.

Peamised erinevused:

Omadus Mälu kogujaja ARC
Tööpõhimõte Juurdepääsmatute objektide otsimine Tugevate viidete arvutamine
Vabastamise hetk Ebapraktiline, skaneerimise ajal Deterministlik, kui viited on 0
Ülalpidamiskulud Peatused programmi täitmisel Väikesed, muutudes loendurit
Prognoositavus Madal Kõrge
Tsüklilised viited Vajavad spetsiaalseid lähenemisi (nt nõrgad viited) Vajavad weak või unowned viiteid
Kasutamine iOS-is Ei ole saadaval kaasaegses Objective-C ja Swiftis Peamine mälu haldamise mehhanism Objective-C ja Swiftis

Näide weak kasutamisest, et vältida tugeva viite tsüklit ARC-is:

class Person {
    let name: String
    var apartment: Apartment? // tugev viide

    init(name: String) {
        self.name = name
        print("\(name) alustab tööd")
    }
    deinit {
        print("\(name) lõpetab tööd")
    }
}

class Apartment {
    let unit: String
    weak var tenant: Person? // nõrk viide

    init(unit: String) {
        self.unit = unit
        print("Apartment \(unit) alustab tööd")
    }
    deinit {
        print("Apartment \(unit) lõpetab tööd")
    }
}

var john: Person?
var unit4A: Apartment?

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

john!.apartment = unit4A
unit4A!.tenant = john // nõrk viide väldib tsüklit

john = nil // Person objekt deiniialiseerub
unit4A = nil // Apartment objekt deiniialiseerub