Unowned nədir?
sobes.tech Süni İntellekt
AI-dan cavab
unowned — Swift-də zəif (weak) referansı elan etmək üçün açar söz. Bu, iki obyektin güclü əlaqəyə malik olduğu və onların həyat dövrlərinin bir-birinə bağlı olduğu halda istifadə olunur, lakin döngüvi referansların qarşısını almaq və yaddaşın sərbəst buraxılmasını əngəlləyə biləcək halları önləmək istəyirik.
Əsas xüsusiyyətlər və weak ilə fərqləri:
- Opsional deyil:
unownedreferans, ona istinad edən obyektin həyat dövrü ərzindənilolmayacaq. - Güclü əlaqə: Bir obyekt digərini idarə etdikdə və ikisi həmişə birlikdə mövcuddursa, istifadə olunur.
- Azad olunarkən: Əgər
unownedreferansla istinad olunan obyekt yaddaşdan silinərsə və referans istifadə olunmadan əvvəl, bu, tətbiqin işləmə zamanında xəta ilə nəticələnəcək (runtime error). Referans olunan obyektin, referansdan daha uzun müddət mövcud olduğundan əmin olmaq lazımdır. - Tətbiq: Çox vaxt delegatlar üçün istifadə olunur, delegat həmişə onu çağıran obyektə nisbətən daha uzun müddət mövcuddursa və ya
self-ə qarşı döngüvi referansları qarşısını almaq üçün,self-i güclü tutmayan bağlamalarda.
İstifadə nümunəsi:
// swift
class MyClass {
var name: String
var closure: (() -> Void)?
init(name: String) {
self.name = name
}
func setupClosure() {
closure = { [unowned self] in // unowned self istifadə edilərək
print("Mənim adım \(self.name)")
}
}
deinit {
print("\(name) sərbəst buraxıldı")
}
}
Delegat üçün istifadə nümunəsi (hətta weak daha çox delegatlar üçün istifadə olunsa da, unowned də mümkündür, əgər delegat garantiylə daha uzun müddət yaşayırsa):
// swift
protocol MyDelegate: AnyObject { // AnyObject referens tipini tələb edir
func doSomething()
}
class DataSource {
unowned var delegate: MyDelegate // unowned referans delegata
init(delegate: MyDelegate) {
self.delegate = delegate
}
func performAction() {
delegate.doSomething()
}
deinit {
print("DataSource sərbəst buraxıldı")
}
}
class MyController: MyDelegate {
var dataSource: DataSource?
override init() {
super.init()
dataSource = DataSource(delegate: self)
}
func doSomething() {
print("Delegat metodu çağırıldı")
}
deinit {
print("MyController sərbəst buraxıldı")
}
}
weak və unowned arasında seçim, referansın opsional olub-olmaması və referans edilən obyektin, referansın sonuna qədər mövcud olub-olmaması ilə bağlıdır. Əgər obyektin, referans istifadə edilməzdən əvvəl sərbəst buraxılması ehtimalı varsa, weak istifadə olunmalıdır. Əgər mövcudluq zəmanətlidirsə və referans opsional olmamalıdırsa, unowned istifadə edilə bilər.