Sobes.tech
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:

  1. Strong (Güclü): Obyektin referens sayğacını artırır. Bu, standart referans növüdür.
  2. 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 nil olur əgər göstərilən obyekt de-allocate edilərsə. weak açar sözü ilə təyin olunur.
  3. 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, unowned referans nil olmur və obyektə giriş cəhdində səhv yarada bilər. unowned aç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