Middle
როგორ შეიძლება თავიდან აიცილოთ iOS-ში შენახვის ციკლი (retain cycle)?
sobes.tech AI
პასუხი AI-სგან
Туура колдонуу менен алсыз (weak) же шартысыз (unowned) шилтемелер аркылуу кармоо циклдери алдын алынышы мүмкүн.
Алсыз шилтемелер (weak):
- Объекттин шилтемелер санын көбөйтпөйт.
- Нөлгө айлануусу мүмкүн (
nil). - Бир объект башка объекттен көз каранды болбосо, колдонулат (мисалы, делегат).
class DelegateExample {
weak var delegate: SomeDelegateType? // Делегатка алсыз шилтеме
}
Шартсыз (unowned) шилтемелер:
- Объекттин шилтемелер санын көбөйтпөйт.
- Гаранттуу
nilэмес. - Бир объект башка объектти ачык эле ээ болсо, бирок көз каранды объект гана ээси менен бирге болушу мүмкүн (мисалы, жабуулар,
self-ди камтыганclassичинде, анда жабуу ачык эле класс экземплярга тиешелүү).unownedшилтемеге кирүүдө, эгер объект алгачкы бошотулуп калса, иштөө учурунда ката болот.
class Owner {
var closure: (() -> Void)?
func setupClosure() {
closure = { [unowned self] in // Шартсыз алсыз шилтеме self-ге
// self колдонуу
print("Using unowned self")
}
}
}
Жабууларда колдонуу:
Жабуулар класстардын экземплярларын күчтүү шилтемеде кармап калса, кармоо циклдерин түзүшү мүмкүн, жана бул класс экземпляры жабууга дагы күчтүү шилтемени камтыйт. Бул алдын алуу үчүн, жабууларда capture list колдонулат:
class HTMLElement {
let name: String
let text: String?
lazy var asHTML: () -> String = { [weak self] in // Алсыз шилтеме self-ге
guard let strongSelf = self else {
return "" // self алгачкы `nil` болсо
}
if let text = strongSelf.text {
return "<\(strongSelf.name)>\(text)</\(strongSelf.name)>"
} else {
return "<\(strongSelf.name)/>"
}
}
init(name: String, text: String? = nil) {
self.name = name
self.text = text
}
deinit {
print("\(name) жоюлду")
}
}
Интихоб между weak и unowned зависит от семантики отношений между объектами:
weak: когда ссылка может статьnilв течение жизненного цикла объекта, на который ссылаются.unowned: когда объект, на который ссылаются, гарантированно существует дольше или столько же, сколько объект, который на него ссылается, и ссылка никогда не станетnil.