Sobes.tech
Middle

Unowned nima?

sobes.tech AI

AIdan javob

unowned — bu Swift tilki kalit so'z bo'lib, u zaif (weak) referensni e'lon qilish uchun ishlatiladi. Bu, agar ikki ob'ekt kuchli bog'langan bo'lsa va ularning hayot aylanishi bir-biriga bog'liq bo'lsa, lekin biz siklik referenslarni oldini olishni istasak, ishlatiladi.

Asosiy xususiyatlar va weak bilan farqlari:

  • Opsional emas: unowned referens, unga murojaat qiladigan ob'ektning hayoti davomida nil bo'lmaydi.
  • Kuchli bog'lanish: Bir ob'ekt boshqasiga egalik qilganda va ular har doim birga mavjud bo'lsa, ishlatiladi.
  • Ozod qilishda: Agar unowned referens bilan murojaat qilinayotgan ob'ekt xotiradan olib tashlangan bo'lsa va referensdan foydalanilsa, bu runtime xatosiga olib keladi. Referens qilinayotgan ob'ekt, referensdan uzoqroq mavjud bo'lishi kerakligini ta'minlash zarur.
  • Qo'llanilishi: Ko'pincha delegatlar uchun ishlatiladi, delegat har doim uni chaqiradigan ob'ektdan uzoqroq mavjud bo'lsa yoki self ga bo'lgan siklik referenslarni oldini olish uchun, self ni kuchli ravishda tutmaydigan closurelarda.

Closureda foydalanish misoli:

// swift
class MyClass {
    var name: String
    var closure: (() -> Void)?

    init(name: String) {
        self.name = name
    }

    func setupClosure() {
        closure = { [unowned self] in // unowned self dan foydalanish
            print("Mening ismim \(self.name)")
        }
    }

    deinit {
        print("\(name) deinitialization qilindi")
    }
}

Delegat uchun foydalanish misoli (garchi weak ko'proq delegatlar uchun ishlatilsa-da, unowned ham mumkin, agar delegat garantiyalangan uzoqroq yashashiga ishonch bo'lsa):

// swift
protocol MyDelegate: AnyObject { // AnyObject referens turini talab qiladi
    func doSomething()
}

class DataSource {
    unowned var delegate: MyDelegate // unowned referens delegatga

    init(delegate: MyDelegate) {
        self.delegate = delegate
    }

    func performAction() {
        delegate.doSomething()
    }

    deinit {
        print("DataSource deinitialization qilindi")
    }
}

class MyController: MyDelegate {
    var dataSource: DataSource?

    override init() {
        super.init()
        dataSource = DataSource(delegate: self)
    }

    func doSomething() {
        print("Delegat metod chaqirildi")
    }

    deinit {
        print("MyController deinitialization qilindi")
    }
}

weak va unowned orasidagi tanlov, referens opsional bo'lib yoki bo'lmasligi va referens qilinayotgan ob'ektning, referensning oxirigacha mavjud bo'lishiga kafolat berilgan yoki yo'qligiga bog'liq. Agar ob'ekt referensdan foydalanishdan oldin ozod qilinishi mumkin bo'lsa, weak ishlatilishi kerak. Agar mavjudlik kafolatlangan bo'lsa va referens opsional bo'lmasligi kerak bo'lsa, unowned ishlatilishi mumkin.