რა არის unowned?
sobes.tech AI
პასუხი AI-სგან
unowned — Swift-də zəif istinad elan etmək üçün açar sözdür. Bu, iki obyektin güclü əlaqəsi olduğu və onların həyat dövrlərinin bir-birinə bağlı olduğu zaman istifadə olunur, lakin biz dövr edən istinadlardan qaçmaq istəyirik, bunlar yaddaşın sərbəst buraxılmasına mane ola bilər.
Əsas xüsusiyyətlər və weak-dən fərqlər:
- Seçimli deyil:
unownedistinad, obyektin həyat dövrü boyuncanilolmayacağını təmin edir. - Güclü əlaqə: Bir obyekt digərini idarə etdikdə və onlar həmişə birlikdə mövcuddursa istifadə olunur.
- Azad edilərkən: Əgər
unownedistinad ilə göstərilən obyekt yaddaşdan azad edilərsə və istinad istifadə edilərsə, bu tətbiqin çökməsinə səbəb olar (runtime error). İstinad göstərən obyektin daha uzun müddət mövcud olduğundan əmin olmaq lazımdır. - İstifadə: Çox vaxt delegatlar üçün istifadə olunur, delegat həmişə onu çağıran obyektə nisbətən daha uzun müddət yaşayırsa və ya
self-ə qarşı dövr edən istinadların qarşısını almaq üçün bağlamalarda istifadə olunur.
İstifadə nümunəsi bağlamada:
// swift
class MyClass {
var name: String
var closure: (() -> Void)?
init(name: String) {
self.name = name
}
func setupClosure() {
closure = { [unowned self] in // unowned self istifadə olunur
print("My name is \(self.name)")
}
}
deinit {
print("\(name) deinitialized")
}
}
Delegat üçün istifadə nümunəsi (həm weak, həm də unowned istifadə oluna bilər, əgər delegat əmin olunursa ki, daha uzun müddət yaşayır):
// swift
protocol MyDelegate: AnyObject { // AnyObject referens tip tələb edir
func doSomething()
}
class DataSource {
unowned var delegate: MyDelegate // unowned istinad delegata
init(delegate: MyDelegate) {
self.delegate = delegate
}
func performAction() {
delegate.doSomething()
}
deinit {
print("DataSource deinitialized")
}
}
class MyController: MyDelegate {
var dataSource: DataSource?
override init() {
super.init()
dataSource = DataSource(delegate: self)
}
func doSomething() {
print("Delegate method called")
}
deinit {
print("MyController deinitialized")
}
}
weak və unowned arasında seçim, istinadın seçimli olub-olmaması və göstərilən obyektin həyat dövrünə bağlıdır. Əgər obyektin əvvəlcədən azad edilə biləcəyi ehtimalı varsa, weak istifadə olunmalıdır. Əks halda, obyektin mövcud olacağına əmin olunursa və istinad seçimli olmamalıdırsa, unowned istifadə edilə bilər.