Sobes.tech
Junior

ԻՕՍ-ում ARC (Ավտոմատ Հղումների Հաշվարկ) ինչ է?

sobes.tech AI

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

ARC — դա հիշողության կառավարման մեխանիզմ է iOS-ում, որը ավտոմատ կերպով հաշվում է օբյեկտների հղումները։ Երբ հղումների քանակը հասնում է զրոյի, ARC-ը ավտոմատ կերպով ազատում է այդ օբյեկտի զբաղեցրած հիշողությունը։

ARC-ի առավելությունները՝

  • Հիշողության արտահոսքների նվազեցում: Ավտոմատացման գործընթացը նվազեցնում է սխալների հավանականությունը, կապված release կամ dealloc մոռացության հետ։
  • Երկակի ազատման պատճառով վթարային փակման նվազեցում: ARC-ը կանխում է արդեն ազատված հիշողության փորձերը։
  • Կոդի պարզեցում: Ծրագրավորողը պետք չէ ձեռքով կառավարել հիշողությունը, ինչը կդարձնի կոդը մաքուր և հասկանալի։

Ավտոմատացման باوجود, ARC-ի օգտագործման ժամանակ կարևոր է հասկանալ ուժեղ և թույլ հղումների կոնցեպցիաները, որպեսզի խուսափել ուժեղ հղումների ցիկլերից (retain cycles

Ուժեղ հղման օրինակ՝

class Person {
    var name: String
    var apartment: Apartment?

    init(name: String) {
        self.name = name
        print("\(name) սկսում է ինիցիալիզացվել")
    }

    deinit {
        print("\(name) դեինիցիալիզացվել է")
    }
}

class Apartment {
    var unit: String
    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

// Հղումների մաքարումը չի հանգեցնում deinit-ի, քանի որ ցիկլ է
john = nil
unit4A = nil

Թույլ հղման օրինակ՝ ցիկլը խզելու համար՝

class Person {
    var name: String
    var apartment: Apartment?

    init(name: String) {
        self.name = name
        print("\(name) սկսում է ինիցիալիզացվել")
    }

    deinit {
        print("\(name) դեինիցիալիզացվել է")
    }
}

class Apartment {
    var 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

// Հղումների մաքարումը հանգեցնում է deinit-ի (ցիկլը խզվում է)
john = nil // Person դեինիցիալիզացված
unit4A = nil // Apartment դեինիցիալիզացված

ARC-ը կիրառվում է դասի օբյեկտների վրա։ Կառուցվածքները և enumerations-ները արժեքային տիպեր են և չեն ենթարկվում ավտոմատ հիշողության կառավարման ARC-ի միջոցով։