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:
unownedOptional эмес (эгерunowned optionalдеп жарыяланбаса).weakар дайым Optional. - Коопсуздук:
unownedшилтемеге ээ объект алда канча деаллокатсияланган болсо, crash болот.weakшилтемеге жетүүnilболот.
Ошентип, unowned — бул менчик эмес (non-owning) шилтеме, ал иштетилет, эгер шилтемеленген объект бар болсо, ал эми unowned шилтемеси бар объект бар болсо.