Sobes.tech
Middle

Wick bağlantıları ilə Anound bağlantıları arasındakı fərq nədir?

sobes.tech Süni İntellekt

AI-dan cavab

Zəif (weak) istinad, obyektin istinad sayğacını artırmayan istinad növüdür. Güclü istinad döngülərini qarşısını almaq üçün istifadə olunur, məsələn, delege və onun sahibi arasında. Əgər zəif istinad göstərdiyi obyekt sərbəst buraxılsa, zəif istinad avtomatik olaraq nil olur.

Unowned (unowned) istinad da obyektin istinad sayğacını artırmayan istinaddır. weak ilə fərqi odur ki, unowned'ın opsional ola bilməz və həmişə mövcud obyektə işarə etməlidir. Əgər unowned ilə göstərilən obyekt sərbəst buraxılsa və istinad artıq mövcud deyilsə, ona giriş səhvinə (fatal error) səbəb olacaq. Bu, əlaqəli obyektin həyat dövrünün, unowned istinadlı obyektin həyat dövründən uzun və ya bərabər olacağı yerlərdə istifadə olunur (məsələn, güclü istinad döngülərində, burada obyektlərin həyat dövrü aydın şəkildə müəyyən edilir).

Müqayisə:

Xüsusiyyət weak unowned
Sahibsiz Bəli Bəli
SC-ni artırır Xeyr Xeyr
nil ola bilərmi Bəli (avtomatik olaraq nil olur) Xeyr (obyektə işarə etməlidir)
Təhlükəsizlik Sərbəst buraxılma ehtimalında daha təhlükəsiz Daha az təhlükəsiz (sərbəst buraxılmış obyektə girişdə ölümcül səhv)
Tip Opsional olmalıdır Opsional ola bilməz (padr)
İstifadə Güclü istinad döngülərini qarşısını almaq üçün, obyekt əvvəlcə mövcud olmaya bilər Güclü istinad döngülərini qarşısını almaq üçün, obyektin mütləq mövcudluğu təmin edilir

weak istifadə nümunəsi:

class Person {
    let name: String
    weak var apartment: Apartment? // zəif istinad, döngünü qarşısını almaq üçün

    init(name: String) {
        self.name = name
        print("\(name) başlanır")
    }

    deinit {
        print("\(name) yox olur")
    }
}

class Apartment {
    let unit: String
    var occupant: Person?

    init(unit: String) {
        self.unit = unit
        print("Mənzil \(unit) başlanır")
    }

    deinit {
        print("Mənzil \(unit) yox olur")
    }
}

unowned istifadə nümunəsi, self-in tutduğu closure-də:

class HTMLElement {
    let name: String
    let text: String?

    lazy var asHTML: () -> String = {
        [unowned self] in // self, döngüyü qarşısını almaq üçün unowned
        if let text = self.text {
            return "<\(self.name)>\(text)</\(self.name)>"
        } else {
            return "<\(self.name) />"
        }
    }

    init(name: String, text: String? = nil) {
        self.name = name
        self.text = text
    }

    deinit {
        print("\(name) yox olur")
    }
}