Mis vahe on Wick-linkide ja Anound-linkide vahel?
sobes.tech AI
Vastus AI-lt
Wick-viide (weak) — see on mitteomandav viide. See ei suurenda objekti viidete arvu. Seda kasutatakse tugevate viidete tsüklite vältimiseks, näiteks delegeedi ja selle omanikku vahel. Kui objekt, millele viitab nõrk viide, deallokeeritakse, muutub nõrk viide automaatselt nil-iks.
Unowned-viide (unowned) — see on samuti mitteomandav viide ega suurenda objekti viidete arvu. Erinevus weak-ist on selles, et unowned ei saa olla valikuline (Optional) ja peab alati viitama olemasolevale objekti. Kui objekt, millele unowned viide viitab, deallokeeritakse enne, kui viide lõpetab olemasolu, põhjustab selle kasutamine jooksva vea (fatali veaga). Seda kasutatakse seal, kus seotud objekti elutsükkel on garanteeritult pikem või võrdne unowned-viidete objekti elutsükliga (näiteks tugevate viidete tsüklid, kus üks objektidel on selgelt määratletud elutsükkel).
Võrdlus:
| Omadus | weak |
unowned |
|---|---|---|
| Mitteomandav | Jah | Jah |
| Suurendab SC-i | Ei | Ei |
Võib olla nil |
Jah (automaatne nullimine) | Ei (peab viitama objekti) |
| Turvalisus | Rohkem turvaline deallokeerimisel | Vähem turvaline (fatali vead) |
| Tüüp | Peab olema valikuline (Optional) |
Ei saa olla valikuline |
| Kasutus | Tugevate viidete tsüklite vältimiseks, kus objekt võib varakult kaduda | Tugevate viidete tsüklite vältimiseks, kus objekt on garanteeritult olemas |
Näide weak kasutamisest tugevate viidete tsükli vältimiseks:
class Person {
let name: String
weak var apartment: Apartment? // nõrk viide tsükli vältimiseks
init(name: String) {
self.name = name
print("\(name) alustas tööd")
}
deinit {
print("\(name) lõpetas tööd")
}
}
class Apartment {
let unit: String
var occupant: Person?
init(unit: String) {
self.unit = unit
print("Apartment \(unit) alustas tööd")
}
deinit {
print("Apartment \(unit) lõpetas tööd")
}
}
Näide unowned kasutamisest self haaramiseks suletise sees:
class HTMLElement {
let name: String
let text: String?
lazy var asHTML: () -> String = {
[unowned self] in // unowned self, et vältida tsüklit
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) deinitialiseeriti")
}
}