Middle
159
Автоматты сілтеме есептеу дегеніміз не?
AI-дан жауап
sobes.tech AI
Автоматтық сілтемелерді есептеу (Automatic Reference Counting, ARC) — бұл Swift және Objective-C тілдеріндегі жадты басқару механизмі, ол автоматты түрде объектілер үшін бөлінген жадты бақылап, босатады. Әрбір класс мысалының сілтеме есептегіші бар, ол объектіге күшті сілтеме жасалғанда өседі және оны жойғанда азаяды. Сілтеме есептегіші нөлге жеткенде, ARC автоматты түрде объектіні деаллоцирлейді және қолданылған жадты босатады.
ARC жадтың ағылуын және екі рет босатылуын болдырмайды, жадты басқаруды жеңілдетеді, ол Objective-C-да ARC-сыз қолмен басқаруға қарағанда оңайырақ.
Үш типтік сілтемелер бар:
- Strong (Қуатты): Объектінің сілтеме есептегішін арттырады. Әдепкі сілтеме түрі.
- Weak (Әлсіз): Сілтеме есептегішін арттырмайды. Екі объект күшті сілтемелер циклін болдырмау үшін пайдаланылады, олар бір-біріне күшті сілтеме жасайды. Әлсіз сілтеме
nilболады, егер ол көрсеткен объекті деаллоцирленсе.weakкілт сөзімен анықталады. - Unowned (Басқарусыз): Сілтеме есептегішін арттырмайды және әрқашан мәні бар. Объект әрқашан бар деп болжанған кезде пайдаланылады.
weak-тен айырмашылығы, басқарусыз сілтемеnilболмайды және объектіге қол жеткізу кезінде қате шығуы мүмкін, егер ол деаллоцирленсе.unownedкілт сөзімен анықталады.
Мысал күшті сілтемелер циклі:
class Human {
let name: String
var apartment: Apartment? // Optional Apartment-ке күшті сілтеме
init(name: String) {
self.name = name
print("\(name) инициализацияланды")
}
deinit {
print("\(name) деинициализацияланды")
}
}
class Apartment {
let unit: String
var tenant: Human? // Optional Human-ке күшті сілтеме
init(unit: String) {
self.unit = unit
print("Apartment \(unit) инициализацияланды")
}
deinit {
print("Apartment \(unit) деинициализацияланды")
}
}
var john: Human?
var unit4A: Apartment?
john = Human(name: "John Appleseed")
unit4A = Apartment(unit: "4A")
john!.apartment = unit4A
unit4A!.tenant = john
john = nil
unit4A = nil
// "John Appleseed деинициализацияланды" және "Apartment 4A деинициализацияланды" шықпайды, себебі цикл күшті сілтемелер арқылы қалыптасқан
Цикл күшті сілтемелерді weak пайдалану арқылы шешу:
class Human {
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: Human? // Әлсіз сілтеме
init(unit: String) {
self.unit = unit
print("Apartment \(unit) инициализацияланды")
}
deinit {
print("Apartment \(unit) деинициализацияланды")
}
}
var john: Human?
var unit4A: Apartment?
john = Human(name: "John Appleseed")
unit4A = Apartment(unit: "4A")
john!.apartment = unit4A
unit4A!.tenant = john
john = nil // John деаллоцирленеді, себебі оның сілтемесі 0
unit4A = nil // Apartment деаллоцирленеді, себебі оның сілтемесі 0