Sobes.tech
Junior

Ինչպես է աշխատում աղբահանության հավաքողը?

sobes.tech AI

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

iOS/macOS ծրագրավորման համատեքստում Swift/Objective-C օգտագործում է ոչ թե մոլուցքի հավաքիչը (GC), այլ ավտոմատ հղումների հաշվարկը (Automatic Reference Counting, ARC):

ARC-ը ավտոմատ կերպով կառավարում է հիշողությունը՝ հաշվելով յուրաքանչյուր դասի օրինակին (և փակագծերի հետ բռնումով) հզոր հղումների քանակը: Երբ հզոր հղումների հաշվիչը զրոյական է դառնում, համակարգը ազատում է օբյեկտի զբաղեցրած հիշողությունը:

Հիմնական կետեր ARC-ի:

  • Հզոր հղումներ (Strong): Հաշվում են հղումների քանակը: Օբյեկտը մնում է հիշողության մեջ, քանի դեռ կա առնվազն մեկ հզոր հղում:
  • Թույլ հղումներ (Weak): Չհաշվում են հղումների քանակը: Օգտագործվում են ուժեղ հղումների ցիկլերը կանխելու համար: Հղվում են օբյեկտին որպես ընտրովի, և երբ օբյեկտը ազատվում է, դառնում են nil:
  • Անհայտ հղումներ (Unowned): Չհաշվում են հղումների քանակը: Օգտագործվում են, երբ օբյեկտների կյանքի ցիկլը հայտնի է և մեկը միշտ գոյություն կունենա մյուսի հետ: Հղումը չի լինում ընտրովի: Եթե այն օբյեկտը, որի վրա հղում է, ազատվում է, փորձը մուտք գործելու ժամանակ սխալ կբերի:

ARC-ը աշխատում է կոմպիլյացիայի փուլում՝ ավելացնելով retain (հաշվիչը բարձրացնել) և release (հաշվիչը նվազեցնել) կանչերը համապատասխան կոդում:

class MyClass {  
    var prop: String = ""  
}

var reference1: MyClass? = MyClass() // Հաշվիչ = 1
var reference2 = reference1 // Հաշվիչ = 2

reference1 = nil // Հաշվիչ = 1
reference2 = nil // Հաշվիչ = 0, օբյեկտը ազատվում է
class Person {  
    let name: String
    weak var apartment: Apartment? // Թույլ հղում ցիկլը կանխելու համար
    init(name: String) { self.name = name; print("(name) is being initialized") }
    deinit { print("(name) is being deinitialized") }
}

class Apartment {  
    let unit: String
    unowned var tenant: Person // Անհայտ հղում
    init(unit: String, tenant: Person) { self.unit = unit; self.tenant = tenant; print("Apartment \(unit) is being initialized") }
    deinit { print("Apartment \(unit) is being deinitialized") }
}