Навъи ишораҳои 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:
unownedOptional нест (агар ҳамчунunowned optionalэълон нашуда бошад).weakҳамеша Optional аст. - Бехатарӣ: Дастрасӣ ба хусусият бо ишораи
unownedба объект, ки аллакай деаллокатсия шудааст, хато (crash) меорад. Дастрасӣ ба ишораҳоиweaknil-ро бармегардонад.
Ҳамин тариқ, unowned — ин ишораи бе-ҳуқуқ (non-owning), ки вақте истифода мешавад, ки кафолат дода мешавад, ки объект ишорашуда то ҳадде, ки вуҷуд дорад, вуҷуд дорад.