Wick шилтемелери менен Anound шилтемелери арасындагы айырма эмнеде?
sobes.tech AI
AIден жооп
Wick-ссылка (weak) — бул менчик эмес шилтеме. Ал объекттин шилтеме санын көбөйтпөйт. Ал күчтүү шилтемелер циклин алдын алуу үчүн колдонулат, мисалы, делегат жана анын ээси ортосунда. Эгерде слабо шилтеме көрсөтүп жаткан объект деструктурленсе, слабо шилтеме автоматтык түрдө nil болот.
Unowned-ссылка (unowned) — бул дагы менчик эмес шилтеме жана объекттин шилтеме санын көбөйтпөйт. weakтен айырмасы — unowned опционалдуу (Optional) боло албайт жана дайыма бар объектке шилтеме кылышы керек. Эгер unowned шилтемеси көрсөтүп жаткан объект деструктурленсе, ал учурда ага жетүү катага алып келет (фаталдык катта). Бул, байланышкан объекттин жашоо цикли анык жана узунураак же unowned шилтемеси бар объекттин жашоо циклине барабар деп кепилденген учурларда колдонулат (мисалы, күчтүү шилтемелер цикли, анда бир объекттин жашоо цикли так аныкталган).
Жалпылоо:
| Өзгөчөлүк | weak |
unowned |
|---|---|---|
| Менчик эмес | Ооба | Ооба |
| SC санын көбөйтөт | Жок | Жок |
nil болушу мүмкүн |
Ооба (автоматтык түрдө нөлдөйт) | Жок (объектке шилтеме кылышы керек) |
| Коопсуздук | Мүмкүн деструктурлөнүүдө көбүрөөк коопсуз | Аз коопсуз (фаталдык кат) |
| Тип | Опционалдуу болушу керек | Опционалдуу болбойт (өзүнчө) |
| Колдонуу | күчтүү шилтемелер циклин алдын алуу үчүн, объект эрте жок болушу мүмкүн | күчтүү шилтемелер циклин алдын алуу үчүн, объект кепилденген түрдө бар |
weak колдонуу мисалы:
class Person {
let name: String
weak var apartment: Apartment? // циклин алдын алуу үчүн слабо шилтеме
init(name: String) {
self.name = name
print("\(name) ишке кирди")
}
deinit {
print("\(name) жыйынтыкталды")
}
}
class Apartment {
let unit: String
var occupant: Person?
init(unit: String) {
self.unit = unit
print("Apartment \(unit) ишке кирди")
}
deinit {
print("Apartment \(unit) жыйынтыкталды")
}
}
unowned колдонуу selfти жабуу үчүн:
class HTMLElement {
let name: String
let text: String?
lazy var asHTML: () -> String = {
[unowned self] in // unowned self цикл түзбөө үчүн
if let text = self.text {
return "<\(self.name)>\(text)</\(self.name)>"
} else {
return "<\(self.name) />"
}
}
init(name: String, text: String? = nil) {
self.name = name
self.text = text
}
deinit {
print("\(name) жыйынтыкталды")
}
}