Middle
Linklərin avtomatik sayımı nədir?
sobes.tech Süni İntellekt
AI-dan cavab
Avtomatik Referans Sayımı (Automatic Reference Counting, ARC) Swift və Objective-C-də yaddaş idarəetmə mexanizmidir və obyektlərə ayrılmış yaddaşı avtomatik izləyir və sərbəst buraxır. Hər bir sinf nümunəsinin referens sayğacı var; bu, obyektə güclü referans yaradıldıqda artır və silindikdə azaldılır. Referens sayğacı sıfıra çatdıqda, ARC obyektin avtomatik olaraq de-allocate edir və istifadə olunan yaddaşı azad edir.
ARC yaddaş sızmalarını və iki dəfə sərbəst buraxmanı qarşısını alır, yaddaş idarəetməsini əl ilə idarəetmə ilə müqayisədə sadələşdirir (məsələn, Objective-C-də ARC olmadan).
Üç növ referans mövcuddur:
- Strong (Güclü): Obyektin referens sayğacını artırır. Bu, standart referans növüdür.
- Weak (Zəif): Referens sayğacını artırmır. İki obyektin bir-birinə güclü referanslar verdiyi zaman dövrü (sikli) qarşısını almaq üçün istifadə olunur. Zəif referans
nilolur əgər göstərilən obyekt de-allocate edilərsə.weakaçar sözü ilə təyin olunur. - Unowned (Sahibsiz): Referens sayğacını artırmır və həmişə dəyərə malikdir. Bu, obyektin mövcud olduğu müddətdə referansın həmişə obyektə işarə edəcəyini bildiyimiz zaman istifadə olunur.
weak-ə nisbətən,unownedreferansnilolmur və obyektə giriş cəhdində səhv yarada bilər.unownedaçar sözü ilə təyin olunur.
Güclü referans sikli nümunəsi:
class Human {
let name: String
var apartment: Apartment? // Opsional Apartment-ə güclü referans
init(name: String) {
self.name = name
print("\(name) başlanır")
}
deinit {
print("\(name) sonlandırılır")
}
}
class Apartment {
let unit: String
var tenant: Human? // Opsional Human-ə güclü referans
init(unit: String) {
self.unit = unit
print("Mənzil \(unit) başlanır")
}
deinit {
print("Mənzil \(unit) sonlandırılır")
}
}
var john: Human?
var unit4A: Apartment?
john = Human(name: "John Appleseed")
unit4A = Apartment(unit: "4A")
john!.apartment = unit4A
unit4A!.tenant = john
john = nil
unit4A = nil
// Güclü referans sikli səbəbindən "John Appleseed sonlandırılır" və ya "Mənzil 4A sonlandırılır" çıxmayacaq.
weak istifadə edərək güclü referans siklini həll etmək:
class Human {
let 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 {
let unit: String
weak var tenant: Human? // Zəif referans
init(unit: String) {
self.unit = unit
print("Mənzil \(unit) başlanır")
}
deinit {
print("Mənzil \(unit) sonlandırılır")
}
}
var john: Human?
var unit4A: Apartment?
john = Human(name: "John Appleseed")
unit4A = Apartment(unit: "4A")
john!.apartment = unit4A
unit4A!.tenant = john
john = nil // John de-allocate edilir, çünki onun referens sayğacı 0 olur
unit4A = nil // Apartment de-allocate edilir, çünki onun referens sayğacı 0 olur