Sobes.tech
Middle

Kāda ir atšķirība starp atkritumu savācēju (garbage collector) un automātisko atmiņas pārvaldību (ARC)?

sobes.tech AI

Atbilde no AI

Automātiskais atmiņas savācējs automātiski atrod un atbrīvo atmiņu, kas vairs netiek izmantota programmā. Tas darbojas fonā, periodiski skenējot kaudzi un identificējot objektus, uz kuriem nav aktīvu atsauces.

ARC (Automatic Reference Counting) Swift un Objective-C pārvalda objektu dzīvi, skaitot katra objekta stipro atsauču skaitu. Kad stipro atsauču skaits sasniedz nulli, ARC automātiski atbrīvo šo objekta aizņemto atmiņu.

Galvenās atšķirības:

Īpašība Atmiņas savācējs ARC
Darbības princips Neaizsniedzamu objektu meklēšana Stipro atsauču skaita skaitīšana
Atbrīvošanas brīdis Nedefinēts, skenējot Determinēts, kad atsauces ir 0
Izdevumi Pārtraukumi programmas izpildē Nelieli, mainoties skaitītājam
Prognozējamība Zema Augsta
Cikliski atsauces Prasa īpašus pieejas (piem., vājās atsauces) Prasa weak vai unowned atsauces
Izmantošana iOS Nav pieejama mūsdienu Objective-C un Swift Galvenais atmiņas pārvaldības mehānisms Objective-C un Swift

Piemērs, kā izmantot weak, lai novērstu stipro atsauču ciklu ARC:

class Person {
    let name: String
    var apartment: Apartment? // stipra atsauce

    init(name: String) {
        self.name = name
        print("\(name) tiek inicializēts")
    }
    deinit {
        print("\(name) tiek deiniālizēts")
    }
}

class Apartment {
    let unit: String
    weak var tenant: Person? // vāja atsauce

    init(unit: String) {
        self.unit = unit
        print("Apartment \(unit) tiek inicializēts")
    }
    deinit {
        print("Apartment \(unit) tiek deiniālizēts")
    }
}

var john: Person?
var unit4A: Apartment?

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

john!.apartment = unit4A
unit4A!.tenant = john // vāja atsauce novērš ciklu

john = nil // Person objekts tiek deiniālizēts
unit4A = nil // Apartment objekts tiek deiniālizēts