Junior
Kas ir ARC (Automātiskā atsauču skaitīšana) iOS?
sobes.tech AI
Atbilde no AI
ARC — tas ir atmiņas pārvaldības mehānisms iOS, kas automātiski skaita atsauces uz objektiem. Kad atsauces uz objekti sasniedz nulli, ARC automātiski atbrīvo šo objektu aizņemto atmiņu.
ARC priekšrocības:
- Samazina atmiņas noplūdes: Automātiskā atmiņas atbrīvošana samazina kļūdu iespējamību, kas saistītas ar aizmirstiem
releasevaidealloc. - Samazina avārijas dēļ dubultas atbrīvošanas: ARC novērš mēģinājumus atbrīvot jau atbrīvotu atmiņu.
- Koda vienkāršošana: Izstrādātājam nav jāvada atmiņa manuāli, kas padara kodu tīrāku un saprotamāku.
Neskatoties uz automatizāciju, izmantojot ARC, ir svarīgi saprast stipro un vājā atsauces koncepcijas, lai izvairītos no stipro atsauču cikliem (retain cycles).
Stipras atsauces piemērs:
class Person {
var name: String
var apartment: Apartment?
init(name: String) {
self.name = name
print("\(name) tiek inicializēts")
}
deinit {
print("\(name) tiek deinitializēts")
}
}
class Apartment {
var unit: String
var tenant: Person? // Stipra atsauce
init(unit: String) {
self.unit = unit
print("Apartment \(unit) tiek inicializēts")
}
deinit {
print("Apartment \(unit) tiek deinitializēts")
}
}
var john: Person?
var unit4A: Apartment?
john = Person(name: "John Appleseed")
unit4A = Apartment(unit: "4A")
// Izveido stipru atsauci abās pusēs
john!.apartment = unit4A
unit4A!.tenant = john
// Atsauces dzēšana neizraisa deinit, jo ir cikls
john = nil
unit4A = nil
Vājās atsauces piemērs, lai pārtrauktu ciklu:
class Person {
var name: String
var apartment: Apartment?
init(name: String) {
self.name = name
print("\(name) tiek inicializēts")
}
deinit {
print("\(name) tiek deinitializēts")
}
}
class Apartment {
var unit: String
weak var tenant: Person? // Vāja atsauce
init(unit: String) {
self.unit = unit
print("Apartment \(unit) tiek inicializēts")
}
deinit {
print("Apartment \(unit) tiek deinitializēts")
}
}
var john: Person?
var unit4A: Apartment?
john = Person(name: "John Appleseed")
unit4A = Apartment(unit: "4A")
john!.apartment = unit4A
unit4A!.tenant = john
// Atsauces dzēšana noved pie deinit (cikls ir pārtraukts)
john = nil // Person tiek deinitializēts
unit4A = nil // Apartment tiek deinitializēts
ARC tiek piemērots klases objektu gadījumā. Struktūras un enumerācijas ir vērtību tipi un netiek automātiski pārvaldītas ar ARC.