Unowned эмне?
sobes.tech AI
AIден жооп
unowned — бул Swiftте алсыз шилтемени жарыялоо үчүн ачкыч сөз. Бул эки объекттин күчтүү байланышы бар жана алардын жашоо цикли бири-бирине көз каранды болсо, бирок биз циклик шилтемелерден качкыбыз келет, алар эс тутумдун бошотулушуна тоскоол болушу мүмкүн.
Негизги өзгөчөлүктөр жана weak менен айырмачылыктар:
- Опционалдуу эмес:
unownedшилтемеси объекттин жашоосу боюnilболбойт деп кепилдик берет. - Күчтүү байланышы: Бир объект башка бирөөнү ээлик кылганда жана алар дайыма бирге болот.
- Бошотулганда: Эгер
unownedшилтемеси менен көрсөтүлгөн объект эс тутумдан алынып салынса, ал колдонмодо каталарга алып келет (runtime error). Шилтемени көрсөтүүчү объекттин жашоосу шилтемеден узун болушу керек. - Колдонуу: Көбүнчө делегаттар үчүн колдонулат, эгер делегат дайыма аны чакырган объекттен узунураак жашаса, же
selfке карата циклик шилтемелерди алдын алуу үчүн, жабыкчаларда колдонулат.
Жабыкча колдонуу мисалы:
// 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 колдонсо болот.