Unowned чист?
sobes.tech AI
Ҷавоб аз AI
unowned — ин калидв в Swift барои эълон кардани истиноди заиф. Ин вақте истифода мешавад, ки ду объект дорои пайванди қавӣ ҳастанд ва ҳаёти онҳо ба ҳам вобаста аст, аммо мо мехоҳем аз пайванди даврӣ, ки метавонад ба озод кардани ёдгирӣ монеъ шавад, канорагирӣ кунем.
Хусусиятҳои асосӣ ва фарқиятҳо бо weak:
- Нопционалӣ: истиноди
unownedкафолат дода намешавад, ки дар тӯли ҳаёти объектnilшавад. - Пайванди қавӣ: Вақте истифода мешавад, ки як объект дигарро соҳибӣ мекунад ва онҳо ҳамеша бо ҳам ҳастанд.
- Ҳангоми озод кардан: Агар объекте, ки ба он истинод
unownedишора мекунад, пеш аз истифодаи истинод аз ёдгирӣ озод шавад, ин ба барнома хато меорад (runtime error). Бояд боварӣ ҳосил кунед, ки объект, ки ба он ишора мекунад, дарозтар аз худи истинод вуҷуд дорад. - Истифода: Бештар барои делегатҳо истифода мешавад, вақте делегат ҳамеша дарозтар аз объекте, ки онро даъват мекунад, вуҷуд дорад, ё дар ҳангоми истифодаи closureҳо, то аз пайванди даврӣ ба
selfпешгирӣ шавад, вақте ки closureself-ро бо қавӣ намегирад.
Масалан дар истифодаи closure:
// swift
class MyClass {
var name: String
var closure: (() -> Void)?
init(name: String) {
self.name = name
}
func setupClosure() {
closure = { [unowned self] in // Истифодаи unowned self
print("My name is \(self.name)")
}
}
deinit {
print("\(name) deinitialized")
}
}
Масалан дар истифодаи делегат (гарчанде weak бештар барои делегатҳо истифода мешавад, unowned низ имконпазир аст, агар делегат гарантӣ дарозтар зиндагӣ кунад):
// swift
protocol MyDelegate: AnyObject { // AnyObject талаб мекунад, ки типи истинодӣ бошад
func doSomething()
}
class DataSource {
unowned var delegate: MyDelegate // истиноди unowned ба делегат
init(delegate: MyDelegate) {
self.delegate = delegate
}
func performAction() {
delegate.doSomething()
}
deinit {
print("DataSource deinitialized")
}
}
class MyController: MyDelegate {
var dataSource: DataSource?
override init() {
super.init()
dataSource = DataSource(delegate: self)
}
func doSomething() {
print("Delegate method called")
}
deinit {
print("MyController deinitialized")
}
}
Интихоб байни weak ва unowned вобаста аст, ки оё истинод опционалӣ аст ва оё объект, ки ба он ишора мекунад, то охири ҳаёти истинод вуҷуд дорад. Агар эҳтимол бошад, ки объект пеш аз истифодаи истинод озод шавад, бояд weak истифода шавад. Агар кафолат дода шавад, ки объект вуҷуд дорад ва истинод набояд опционалӣ бошад, метавон unowned истифода кард.