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
// Հղումների մաքարումը հանգեցնում է deinit-ի (ցիկլը խզվում է)
john = nil // Person դեինիցիալիզացված
unit4A = nil // Apartment դեինիցիալիզացված
ARC-ը կիրառվում է դասի օբյեկտների վրա։ Կառուցվածքները և enumerations-ները արժեքային տիպեր են և չեն ենթարկվում ավտոմատ հիշողության կառավարման ARC-ի միջոցով։