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ü:
unownedistifadə olunur, obyektin referans aldığı obyektin həyatı bərabər və ya daha uzun olarsa.weakistifadə olunur, obyektin daha erkən dealloc edilə biləcəyi hallarda. - Optional:
unownedoptional deyil (əgərunowned optionalkimi elan edilməyibsə).weakhəmişə Optional olur. - Təhlükəsizlik:
unownedreferansla artıq dealloc edilmiş obyektə giriş crash-ə səbəb olar.weakreferansnilqaytarar.
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.