Junior
Mis on ARC (Automaatne viidete arvutamine) iOS-is?
sobes.tech AI
Vastus AI-lt
ARC — see on mäluhaldu mehhanism iOS-is, mis automaatselt arvutab objektidele viidete arvu. Kui viidete arv objekti peale nulli, vabastab ARC automaatselt selle objekti poolt kasutatud mälu.
ARC eelised:
- Vähendab mälu lekked: Automaatne mälu vabastamise protsess vähendab vigu, mis on seotud unustatud
releasevõideallockäskudega. - Vähendab krahhe duplikaalse vabastamise tõttu: ARC takistab katseid vabastada juba vaba mälu.
- Koodi lihtsustamine: Arendaja ei pea mälu käsitsi haldama, mis muudab koodi puhtamaks ja arusaadavamaks.
Vaatamata automatiseerimisele on ARC kasutamisel oluline mõista tugevate ja nõrkade viidete kontseptsioone, et vältida tugevate viidete tsükleid (retain cycles).
Tugeva viite näide:
class Person {
var name: String
var apartment: Apartment?
init(name: String) {
self.name = name
print("\(name) on initsialiseeritud")
}
deinit {
print("\(name) on de-initsialiseeritud")
}
}
class Apartment {
var unit: String
var tenant: Person? // Tugev viide
init(unit: String) {
self.unit = unit
print("Apartment \(unit) on initsialiseeritud")
}
deinit {
print("Apartment \(unit) on de-initsialiseeritud")
}
}
var john: Person?
var unit4A: Apartment?
john = Person(name: "John Appleseed")
unit4A = Apartment(unit: "4A")
// Loome tugeva viite mõlemalt poolt
john!.apartment = unit4A
unit4A!.tenant = john
// Viidete kustutamine ei põhjusta deinit, kuna on tsükkel
john = nil
unit4A = nil
Nõrga viite näide tsükli katkestamiseks:
class Person {
var name: String
var apartment: Apartment?
init(name: String) {
self.name = name
print("\(name) on initsialiseeritud")
}
deinit {
print("\(name) on de-initsialiseeritud")
}
}
class Apartment {
var unit: String
weak var tenant: Person? // Nõrk viide
init(unit: String) {
self.unit = unit
print("Apartment \(unit) on initsialiseeritud")
}
deinit {
print("Apartment \(unit) on de-initsialiseeritud")
}
}
var john: Person?
var unit4A: Apartment?
john = Person(name: "John Appleseed")
unit4A = Apartment(unit: "4A")
john!.apartment = unit4A
unit4A!.tenant = john
// Viidete kustutamine viib deinit-ni (tsükkel on katkestatud)
john = nil // Person on de-initsialiseeritud
unit4A = nil // Apartment on de-initsialiseeritud
ARC rakendub klassi objektidele. Struktuurid ja enumeratsioonid on väärtusetüübid ning neid ei hallata automaatselt ARC abil.