Wick-uzatishlari va Anound-uzatishlari o'rtasidagi farq nima?
sobes.tech AI
AIdan javob
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 opsional (Optional) 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 (varsayılan) |
| İ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? // güclü döngünü qarşısını almaq üçün zəif istinad
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, güclü istinad döngüsünü 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")
}
}