Sobes.tech
Middle

რა არის 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: unowned istinad, obyektin həyat dövrü boyunca nil olmayacağı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 unowned istinad 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")
    }
}

weakunowned 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.