Junior
iOSтогу 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
// шилтемелерди өчүрүү циклди үзүү үчүн
john = nil // Person деструктуризацияланууда
unit4A = nil // Apartment деструктуризацияланууда
ARC класс объекттерине колдонулат. Структуралар жана энумерациялар — маанилүү түрлөр жана автоматтык эс тутум башкаруу аркылуу ARCке жакын эмес.