Sobes.tech
Middle

Swift kontekstində unowned nədir?

sobes.tech Süni İntellekt

AI-dan cavab

Unowned Swift-də avtomatik yaddaş idarəsinə (ARC) istinad edir. Unowned istinadlar, iki obyekt bir-birinə güclü istinad etdikdə yaranan güclü istinad döngələrini qarşısını almaq üçün istifadə olunur. Unowned istinad obyekti üçün istinad sayını artırmır. Weak istinaddan fərqli olaraq, unowned istinad həmişə mövcud olan nümunəyə işarə etdiyini gözləyir; əgər unowned istinad ilə göstərilən nümunə sərbəst buraxılsa, ona giriş cəhdi icra zamanı səhvə səbəb olacaq. Bu, əlaqəli obyektin həyat dövrü unowned istinadını ehtiva edən obyektin həyat dövrü ilə eyni və ya daha uzun olduqda istifadə olunur.

İstifadə nümunəsi:

class Department {
    var name: String
    var courses: [Course] = []

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

    deinit {
        print("\(name) şöbə sonlandırılır")
    }
}

class Course {
    var name: String
    unowned var department: Department // Unowned zəif istinad

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

    deinit {
        print("\(name) kurs sonlandırılır")
    }
}

var accounting: Department? = Department(name: "Hesablama")
var introToAccounting: Course? = Course(name: "Hesablama ilə tanışlıq", department: accounting!)

accounting!.courses.append(introToAccounting!)

accounting = nil // İndi Department obyekti sərbəst buraxıla bilər
introToAccounting = nil // İndi Course obyekti sərbəst buraxıla bilər

Bu nümunədə, Course Department-a unowned istinad edir. Çünki, Course Department olmadan mövcud ola bilməz (mənəvi olaraq), və Department courses massiv vasitəsilə Course-un həyat dövrünü idarə edir, ona görə də unowned burada uyğundur. Bu, accountingintroToAccounting arasındakı güclü istinad döngüsünü qarşısını alır. accounting nil-ə çevrildikdə, Department obyekti sərbəst buraxılır və sonra Course obyekti də, ona artıq güclü istinadlar olmadığı üçün, sərbəst buraxılır.