Sobes.tech
Middle

Ի՞նչ է տարբերությունը աղբահանության հավաքողի (garbage collector) և ավտոմատ հիշողության կառավարիչ (ARC) միջև։

sobes.tech AI

Պատասխան AI-ից

Ավտոմատ հավաքողը ինքնաբերաբար գտնում և ազատում է հիշողությունը, որը այլևս չի օգտագործվում ծրագրի կողմից: Նա աշխատում է ֆոնային ռեժիմում, ժամանակ առ ժամանակ սկանավորում է հողամասը և նույնականացնում օբյեկտները, որոնց վրա ակտիվ հղումներ չկան:

ARC (Automatic Reference Counting)-ը Swift և Objective-C-ում կառավարում է օբյեկտների կյանքը՝ հաշվելով յուրաքանչյուր օբյեկտի վրա ուժեղ հղումների քանակը: Երբ ուժեղ հղումների քանակը օբյեկտի վրա հասնում է զրոյի, ARC-ը ինքնաբերաբար ազատում է այդ օբյեկտի զբաղեցրած հիշողությունը:

Հիմնական տարբերությունները՝

Գծագիր Հավաքողը ARC
Աշխատանքի սկզբունք Անհասանելի օբյեկտների որոնում Ուժեղ հղումների հաշիվը
Անհասանելիության պահը Անհատական, սկանավորման ժամանակ Դիտարկվող, երբ հղումները զրոյական են
Օգտագործման ծախսերը Դադարներ ծրագրի կատարման ժամանակ Փոքր, փոփոխության ժամանակ
Նախատեսելիություն Նվազ, սկանավորման ժամանակ Բարձր, երբ հղումները զրոյական են
Շրջանառական հղումներ Պահանջում են հատուկ մոտեցումներ (օրինակ՝ թույլ հղումներ) Պահանջում են weak կամ unowned հղումներ
Օգտագործում iOS-ում Չի առկա արդի Objective-C և Swift-ում Հիմնական մեխանիզմը հիշողության կառավարման համար Objective-C և Swift-ում

Օրինակ՝ weak օգտագործելով շրջանցելու ուժեղ հղումների ցիկլը ARC-ում:

class Person {
    let name: String
    var apartment: Apartment? // ուժեղ հղում

    init(name: String) {
        self.name = name
        print("\(name) սկսում է աշխատել")
    }
    deinit {
        print("\(name) ավարտում է աշխատել")
    }
}

class Apartment {
    let unit: String
    weak var tenant: Person? // թույլ հղում

    init(unit: String) {
        self.unit = unit
        print("Apartment \(unit) սկսում է աշխատել")
    }
    deinit {
        print("Apartment \(unit) ավարտում է աշխատել")
    }
}

var john: Person?
var unit4A: Apartment?

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

john!.apartment = unit4A
unit4A!.tenant = john // թույլ հղում կանխում է ցիկլը

john = nil // Person օբյեկտը դեինիցիալիզացվում է
unit4A = nil // Apartment օբյեկտը դեինիցիալիզացվում է