Sobes.tech
Middle

Навъи ишораҳои unowned барои чӣ аст?

sobes.tech AI

Ҷавоб аз AI

Референтҳои unowned барои ҳалли циклиҳои ишора (retain cycles) байни объектҳо заруранд, вақте ки ҳарду объект ишораҳои қавӣ ба ҳам доранд, аммо яке аз онҳо муҳлати зиндагии кӯтоҳтар ё баробар бо дигар дорад.

unowned истифода мешавад, вақте ки маълум аст, ки объекте, ки ишора мешавад, дар тамоми давраи зиндагии объекте, ки ишораро дорад, nil нахоҳад шуд. Баръакс ба weak, дар unowned дар вақти дастрасӣ ба ишора Optional истифода намешавад. Агар объекте, ки ба он ишора мешавад, пеш аз объекте, ки дорои unowned ишора аст, деаллокатсия шавад, хато (crash) рух медиҳад.

Масалан дар истифодаи дар closure:

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 нест) Apartment низ деаллокатсия мешавад.

Тамоми фарқиятҳо бо weak:

  • Ҳаётӣ: unowned истифода мешавад, вақте ки объект ишорашуда ҳаёти баробар ё дарозтар дорад. weak истифода мешавад, вақте ки объект ишорашуда метавонад пеш аз он деаллокатсия шавад.
  • Optional: unowned Optional нест (агар ҳамчун unowned optional эълон нашуда бошад). weak ҳамеша Optional аст.
  • Бехатарӣ: Дастрасӣ ба хусусият бо ишораи unowned ба объект, ки аллакай деаллокатсия шудааст, хато (crash) меорад. Дастрасӣ ба ишораҳои weak nil-ро бармегардонад.

Ҳамин тариқ, unowned — ин ишораи бе-ҳуқуқ (non-owning), ки вақте истифода мешавад, ки кафолат дода мешавад, ки объект ишорашуда то ҳадде, ки вуҷуд дорад, вуҷуд дорад.