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болбойт.