Sobes.tech
Middle

Unowned turdagi havolalar nima uchun kerak?

sobes.tech AI

AIdan javob

unowned referanslar, obyektlar o'rtasidagi siklik referanslarni (retain cycles) hal qilish uchun kerak bo'ladi, bu holda ikkala obyekt ham bir-biriga kuchli referansga ega, ammo ularning hayot aylanishi qisqaroq yoki teng bo'ladi.

unowned ishlatiladi, agar ma'lum bo'lsa, referans qilinayotgan obyekt, referansni o'z ichiga olgan obyektning hayoti davomida nil bo'lmaydi. weak bilan farqli o'laroq, unowned referansga kirishda Optional ishlatilmaydi. Agar unowned referans qilinayotgan obyekt, unowned referansga ega obyektdan oldin deallocatsiya qilinsa, crash yuz beradi.

Kapanishlarda foydalanish misoli:

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

    init(name: String) {
        self.name = name
        print("\(name) boshlanishi")
    }

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

class Apartment {
    let unit: String
    // Apartment Person bilan bo'lishi ma'lum bo'lganligi uchun unowned ishlatiladi
    // (bu kontekstda). Person `nil` bo'lishi mumkin,
    // ammo agar Apartment mavjud bo'lsa, Person ham mavjud.
    unowned let tenant: Person

    init(unit: String, tenant: Person) {
        self.unit = unit
        self.tenant = tenant
        print("Kvartira \(unit) boshlanishi")
    }

    deinit {
        print("Kvartira \(unit) tugatilishi")
    }
}

var john: Person?
var unit4A: Apartment?

john = Person(name: "John Appleseed")
// Bu misolda, tenant `nil` bo'lishi mumkin, shuning uchun
// unowned optional ishlatiladi
unit4A = Apartment(unit: "4A", tenant: john!)

john!.apartment = unit4A

// Kuchli referanslarni uzaymiz, deallocatsiyani tekshirish uchun
john = nil
unit4A = nil

Bu misolda, Person kuchli referans bilan Apartment ga ega (var apartment: Apartment?). Apartment kuchli referans bilan Person ga ega bo'lishi mumkin, bu siklni hosil qiladi. Ammo, bu kontekstda, Apartment Personsiz mavjud bo'lishi mumkin emas (u ijaraga oladi), shuning uchun Apartment dan Person ga referans unowned qilinadi. Shunday qilib, john = nil qilinsa, Person deallocatsiya qilinadi, va natijada (kuchli referanslar bo'lmagani uchun) Apartment ham deallocatsiya qilinadi.

weak bilan asosiy farqlar:

  • Hayot aylanishi: unowned ishlatiladi, agar referans qilinayotgan obyektning hayoti, referansni o'z ichiga olgan obyekt bilan bir xil yoki undan uzoq bo'lsa. weak ishlatiladi, agar referans qilinayotgan obyekt, undan oldin deallocatsiya qilinishi mumkin.
  • Optional: unowned optional emas (agar unowned optional deb e'lon qilinmagan bo'lsa). weak har doim Optional.
  • Xavfsizlik: unowned referensga kirish, agar obyekt allaqachon deallocatsiya qilinsa, crashga olib keladi. weak referensga kirish nil qaytaradi.

Shunday qilib, unowned - bu non-owning (egalik qilmaydigan) referens bo'lib, u, referans qilinayotgan obyekt, unowned referensli obyekt mavjud bo'lsa, mavjud bo'lishi kafolatlangan holda ishlatiladi.