Sobes.tech
Middle

Unowned referans tipi nə üçün lazımdır?

sobes.tech Süni İntellekt

AI-dan cavab

unowned istinadlar, obyektlər arasında döngüvi istinadların (retain cycles) həllində istifadə olunur, burada hər iki obyekt bir-birinə güclü istinadlara malikdir, lakin bir obyektin həyat dövrü digərindən daha qısa və ya bərabərdir.

unowned istifadə olunur, obyektə istinad edilən zaman onun nil olmayacağı məlum olduqda, yəni obyektin bütün həyat dövrü ərzində. weak-dən fərqli olaraq, unowned-a müraciət edərkən Optional istifadə edilmir. Əgər unowned-a istinad edilən obyekt dealloc edilərsə, unowned referanslı obyekt əvvəlcə nil olacaq və bu zaman crash baş verəcək.

İstifadə nümunəsi closure-lərdə:

class Person {
    let name: String
    var apartment: Apartment?

    init(name: String) {
        self.name = name
        print("\(name) başlanır")
    }

    deinit {
        print("\(name) bitir")
    }
}

class Apartment {
    let unit: String
    // Apartment-in Person olmadan mövcud ola bilməyəcəyini bildiyimiz üçün unowned istifadə olunur
    // (bu kontekstdə). Person `nil` ola bilər,
    // amma Apartment mövcuddursa, Person də mövcuddur.
    unowned let tenant: Person

    init(unit: String, tenant: Person) {
        self.unit = unit
        self.tenant = tenant
        print("Mənzil \(unit) başlanır")
    }

    deinit {
        print("Mənzil \(unit) bitir")
    }
}

var john: Person?
var unit4A: Apartment?

john = Person(name: "John Appleseed")
// Bu nümunədə, tenant `nil` ola bilər, ona görə
// unowned optional istifadə olunur
unit4A = Apartment(unit: "4A", tenant: john!)

john!.apartment = unit4A

// Güclü istinadları qırıb, deallocasiyanı yoxlayaq
john = nil
unit4A = nil

Bu nümunədə, Person güclü istinadla Apartment-a malikdir (var apartment: Apartment?). Apartment güclü istinadla Person-a malik ola bilər, bu da döngü yaradar. Ancaq, bu kontekstdə, Apartment-in Person olmadan mövcud ola bilməyəcəyini bildiyimiz üçün, Apartment-dən Person-ə istinad unowned edilir. Beləliklə, john = nil qoyulduqda, Person dealloc edilir və (güclü istinadlar olmadığı üçün) Apartment də dealloc edilir.

Əsas fərqlər weak-ə qarşı:

  • Həyat dövrü: unowned istifadə olunur, obyektin referans aldığı obyektin həyatı bərabər və ya daha uzun olarsa. weak istifadə olunur, obyektin daha erkən dealloc edilə biləcəyi hallarda.
  • Optional: unowned optional deyil (əgər unowned optional kimi elan edilməyibsə). weak həmişə Optional olur.
  • Təhlükəsizlik: unowned referansla artıq dealloc edilmiş obyektə giriş crash-ə səbəb olar. weak referans nil qaytarar.

Beləliklə, unowned qeyri-mülkiyyətli (non-owning) referansdır və obyektin mövcudluğu, onun unowned referanslı obyektin mövcudluğu ilə təmin edilir.