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") }
}