Junior
iOS-də ARC (Avtomatik İstinad Sayımı) nədir?
sobes.tech Süni İntellekt
AI-dan cavab
ARC, iOS-də yaddaş idarəetmə mexanizmidir və avtomatik olaraq obyektlərə olan istinadların sayını sayır. Bir obyektə olan istinadların sayı sıfıra çatdıqda, ARC avtomatik olaraq həmin obyektin tutduğu yaddaşı sərbəst buraxır.
ARC-nin üstünlükləri:
- Yaddaş sızmalarının azaldılması: Yaddaşın sərbəst buraxılması prosesinin avtomatlaşdırılması, unudulmuş
releasevə yadeallocilə əlaqəli səhvlərin ehtimalını azaldır. - İki dəfə sərbəst buraxmadan yaranan çökmələrin qarşısını alma: ARC, artıq sərbəst buraxılmış yaddaşı yenidən sərbəst buraxmağa cəhdləri qarşısını alır.
- Kodu sadələşdirmək: İnkişaf etdirici yaddaşı əl ilə idarə etməyə ehtiyac duymur, bu da kodu daha təmiz və anlaşılan edir.
Avtomatlaşdırma olsa da, ARC istifadə edərkən güclü və zəif istinad anlayışlarını başa düşmək vacibdir ki, güclü istinad döngələri (retain cycles) qarşısını almaq mümkün olsun.
Güclü istinad nümunəsi:
class Person {
var name: String
var apartment: Apartment?
init(name: String) {
self.name = name
print("\(name) başlanır")
}
deinit {
print("\(name) sonlandırılır")
}
}
class Apartment {
var unit: String
var tenant: Person? // Güclü istinad
init(unit: String) {
self.unit = unit
print("Mənzil \(unit) başlanır")
}
deinit {
print("Mənzil \(unit) sonlandırılır")
}
}
var john: Person?
var unit4A: Apartment?
john = Person(name: "John Appleseed")
unit4A = Apartment(unit: "4A")
// Hər iki tərəfdə güclü istinad yaradılması
john!.apartment = unit4A
unit4A!.tenant = john
// İstinadların sıfırlanması döngü yaratmır
john = nil
unit4A = nil
Döngünü pozmaq üçün zəif istinad nümunəsi:
class Person {
var name: String
var apartment: Apartment?
init(name: String) {
self.name = name
print("\(name) başlanır")
}
deinit {
print("\(name) sonlandırılır")
}
}
class Apartment {
var unit: String
weak var tenant: Person? // Zəif istinad
init(unit: String) {
self.unit = unit
print("Mənzil \(unit) başlanır")
}
deinit {
print("Mənzil \(unit) sonlandırılır")
}
}
var john: Person?
var unit4A: Apartment?
john = Person(name: "John Appleseed")
unit4A = Apartment(unit: "4A")
john!.apartment = unit4A
unit4A!.tenant = john
// İstinadların sıfırlanması döngünü pozur (deinit çağırılır)
john = nil // Person sonlandırıldı
unit4A = nil // Apartment sonlandırıldı
ARC, sinif obyektlərinə tətbiq edilir. Strukturlar və enumerasiyalar dəyər tipləridir və avtomatik yaddaş idarəetməsinə tabe deyillər.