Middle+
Capture Listте дайым weak же unowned колдонуу керекпи?
sobes.tech AI
AIден жооп
Жок, ар дайым эмес.
weak жана unowned күчтүү шилтемелер циклин алдын алуу үчүн колдонулат (retain cycles), анда шилтеме берүүчү блок объектке күчтүү шилтеме кармайт жана объект өз кезегинде блокка күчтүү шилтеме кармайт.
weak же unowned колдонуу керек, эгер блок self же башка шилтемелүү түргө күчтүү шилтеме алса жана күчтүү шилтемелер цикли пайда болушу мүмкүн болсо.
Кайсы учурларда weak/unowned колдонуу керек эмес:
- Блок баалуу түрлөрүн (структуралар, энумуэйлер, кортеждер) кармайт. Алар кармалганда көчүрүлөт жана цикли түзүлбөйт.
- Блок шилтемелүү түрдү кармайт, бирок эки тараптуу күчтүү шилтеме жок. Мисалы, эгер блок локалдуу метод ичинде түзүлүп, ага шилтеме берген объект сакталбаса.
- Блок кыска мөөнөттүү жана ал аткарылгандан кийин объект бошотулат. Мисалы, Completion Handler катары берилген блок, ал дароо аткарылат.
weak жана unowned ортосунда тандоо:
weak: эгер кармалган объект кез келген учурдаnilболушу мүмкүн болсо, колдонулат. Шилтеме опционал (ObjectType?). Колдонмого мурун текшерүү керек.unowned: эгер белгилүү болсо, кармалган объект эч качан блок аткарылгандан кийин бар болот. Шилтеме опционал эмес (ObjectType).nilтекшерүүсү талап кылынбайт.unownedколдонуу объектnilболсо, катага алып келет (runtime error).
// Мисал, `weak`/`unowned` керек эмес (структураны кармоо)
struct MyStruct {
var value: Int
}
let myStruct = MyStruct(value: 10)
let closure = {
print(myStruct.value) // көчүрмө
}
closure()
// Мисал, `weak`/`unowned` керек эмес (локалдык блок)
class MyClass {
func doSomething() {
let localValue = 5
let localClosure = {
print(self.description) // self кармалат, бирок блок сакталбайт
}
localClosure()
}
var description: String {
return "MyClass объекти"
}
}
let myObject = MyClass()
myObject.doSomething()
// Мисал, `weak` керек (мүмкүн `nil`)
class AsyncOperation {
var completionHandler: (() -> Void)?
func performOperation() {
DispatchQueue.global().async {
print("Операция аяктады")
self.completionHandler?()
}
}
deinit {
print("AsyncOperation бошотулду")
}
}
class ViewController {
var op: AsyncOperation?
func setupOperation() {
op = AsyncOperation()
op?.completionHandler = { [weak self] in
guard let self = self else { return }
print("ViewControllerдеги Complete Handler: \(self)")
}
}
deinit {
print("ViewController бошотулду")
}
}
// Мисал, `unowned` керек (гарантияланган бар)
class Button {
var action: (() -> Void)?
func tap() {
action?()
}
deinit {
print("Button бошотулду")
}
}
class ViewControllerWithButton {
var button: Button
init() {
button = Button()
button.action = { [unowned self] in
print("Button басылды ViewControllerWithButtonда: \(self)")
}
}
deinit {
print("ViewControllerWithButton бошотулду")
}
}