Sobes.tech
Middle

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: unowned referans, ona istinad edən obyektin həyat dövrü ərzində nil olmayacaq.
  • Güclü əlaqə: Bir obyekt digərini idarə etdikdə və ikisi həmişə birlikdə mövcuddursa, istifadə olunur.
  • Azad olunarkən: Əgər unowned referansla 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ı")
    }
}

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