Mi a különbség a Wick- és az Anound-linkek között?
sobes.tech MI
Válasz az MI-től
Wick-hivatkozás (weak) — ez egy nem tulajdonló hivatkozás. Nem növeli a hivatkozásszámot az objektumon. Akkor használják, amikor el akarják kerülni az erős hivatkozási ciklusokat, például a delegát és a tulajdonosa között. Ha az objektum, amelyre a gyenge hivatkozás mutat, deállokcióra kerül, a gyenge hivatkozás automatikusan nil lesz.
Unowned-hivatkozás (unowned) — ez szintén nem tulajdonló hivatkozás, és nem növeli az objektum hivatkozásszámát. A weak-től abban különbözik, hogy az unowned nem lehet opcionális (Optional), és mindig egy létező objektumra kell mutatnia. Ha az objektum, amelyre az unowned hivatkozás mutat, deállokcióra kerül, mielőtt a hivatkozás megszűnne létezni, a hozzáférés hibát fog eredményezni (fatális hiba). Akkor használják, amikor a kapcsolódó objektum életciklusa garantáltan hosszabb vagy egyenlő az unowned-hivatkozású objektuméval (például erős hivatkozási ciklusok esetén, ahol az egyik objektumnak egyértelműen meghatározott életciklusa van).
Összehasonlítás:
| Jellemző | weak |
unowned |
|---|---|---|
| Nem tulajdonló | Igen | Igen |
| Növeli az SC-t | Nem | Nem |
Lehet nil |
Igen (automatikusan nullázódik) | Nem (objektumra kell mutatnia) |
| Biztonság | Biztonságosabb a deállokció esetén | Kevésbé biztonságos (fatális hiba a deállokciózott objektumhoz való hozzáféréskor) |
| Típus | Opcionalis kell legyen | Nem lehet opcionális (alapértelmezett) |
| Használat | Erős hivatkozási ciklusok megelőzése, ahol az objektum megszűnhet létezni előbb | Erős hivatkozási ciklusok megelőzése, ahol az objektum garantáltan létezik |
Példa a weak használatára az erős hivatkozási ciklus megelőzésére:
class Person {
let name: String
weak var apartment: Apartment? // gyenge hivatkozás a ciklus elkerülése érdekében
init(name: String) {
self.name = name
print("\(name) inicializálódik")
}
deinit {
print("\(name) deinitializálódik")
}
}
class Apartment {
let unit: String
var occupant: Person?
init(unit: String) {
self.unit = unit
print("Apartment \(unit) inicializálódik")
}
deinit {
print("Apartment \(unit) deinitializálódik")
}
}
Példa az unowned használatára a self foglalásával a zárványban:
class HTMLElement {
let name: String
let text: String?
lazy var asHTML: () -> String = {
[unowned self] in // unowned self a ciklus elkerülése érdekében
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) deinitializálódik")
}
}