Sobes.tech
Middle

Unowned шилтемелердин түрү эмне үчүн керек?

sobes.tech AI

AIден жооп

unowned шилтемелер циклик шилтемелерди (retain cycles) чечүү үчүн керек, эки объект бири-бирине күчтүү шилтемелерге ээ болгондо, бирок алардын бири башкасына караганда кыска же тең мөөнөттүү болушу мүмкүн.

unowned колдонулат, эгер шилтемеленген объект бүт өмүр бою nil болбой турганы белгилүү болсо, ал эми шилтемени камтыган объекттин өмүрү узак же тең болушу мүмкүн. weak менен айырмаланып, unowned шилтемеге жетүүдө Optional колдонулбайт. Эгер unowned шилтемеге шилтемеленген объект алда канча эрте деаллокатцияланса, crash болот.

Мисал катары колдонуу:

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

    init(name: String) {
        self.name = name
        print("\(name) инициализацияланууда")
    }

    deinit {
        print("\(name) деинициализацияланууда")
    }
}

class Apartment {
    let unit: String
    // `unowned` колдонобуз, анткени белгилүү, 
    // Apartment Person жок болсо иштебейт
    // (бул контекстте). Person nil болушу мүмкүн,
    // бирок Apartment болсо, Person да болот.
    unowned let tenant: Person

    init(unit: String, tenant: Person) {
        self.unit = unit
        self.tenant = tenant
        print("Apartment \(unit) инициализацияланууда")
    }

    deinit {
        print("Apartment \(unit) деинициализацияланууда")
    }
}

var john: Person?
var unit4A: Apartment?

john = Person(name: "John Appleseed")
// Бул мисалда tenant nil болушу мүмкүн, ошондуктан `unowned`
unit4A = Apartment(unit: "4A", tenant: john!)

john!.apartment = unit4A

// күчтүү шилтемелерди үзүү үчүн, деаллокатсияны текшерүү
john = nil
unit4A = nil

Бул мисалда, Person күчтүү шилтемеге ээ Apartment-ке (var apartment: Apartment?). Apartment да күчтүү шилтемеге ээ болушу мүмкүн Person-ге, бул цикл түзөт. Бирок, бул контекстте Apartment логикалык жактан Person жок болсо иштебейт (арендатор), ошондуктан Apartment-тен Person-ге шилтеме unowned менен жасалган. Ошентип, john = nil деп койгондо, Person деаллокатсияланат, жана андан кийин (күчтүү шилтемелер жоктугунан) Apartment да деаллокатсияланат.

Негизги айырмачылыктар weak менен:

  • Өмүр цикли: unowned колдонулат, эгер шилтемеленген объекттин өмүрү бирдей же узак болсо. weak колдонулат, эгер ал эрте деаллокатсияланса.
  • Optional: unowned Optional эмес (эгер unowned optional деп жарыяланбаса). weak ар дайым Optional.
  • Коопсуздук: unowned шилтемеге ээ объект алда канча деаллокатсияланган болсо, crash болот. weak шилтемеге жетүү nil болот.

Ошентип, unowned — бул менчик эмес (non-owning) шилтеме, ал иштетилет, эгер шилтемеленген объект бар болсо, ал эми unowned шилтемеси бар объект бар болсо.