Kāda ir atšķirība starp Wick saitēm un Anound saitēm?
sobes.tech AI
Atbilde no AI
Wick saite (weak) — tā ir ne īpašumtiesīga saite. Tā nepalielina objekta saistīto saite skaitu. To izmanto, lai novērstu stipro saistību ciklus, piemēram, starp deleģentu un tā īpašnieku. Ja objekts, uz kuru norāda vājinātā saite, tiek deallokēts, vājinātā saite automātiski kļūst par nil.
Unowned saite (unowned) — tāpat ir ne īpašumtiesīga saite un nepalielina objekta saistīto saite skaitu. Atšķirība no weak ir tā, ka unowned nevar būt opcionala (Optional) un vienmēr jānorāda uz esošu objektu. Ja objekts, uz kuru norāda unowned saite, tiek deallokēts pirms saites piekļuves, mēģinājums piekļūt šai saitei izraisīs izpildes kļūdu (fatālu kļūdu). To izmanto tur, kur saistītā objekta dzīves cikls ir garantēti ilgāks vai vienāds ar unowned saites objekta dzīves ciklu (piemēram, stipro saistību cikls, kurā viens objekts ir ar skaidri noteiktu dzīves ciklu).
Salīdzinājums:
| Īpašība | weak |
unowned |
|---|---|---|
| Ne īpašumtiesīga | Jā | Jā |
| Palielina SC skaitu | Nē | Nē |
Var būt nil |
Jā (automātiski nullejas) | Nē (jānorāda uz objektu) |
| Drošība | Drošāka, ja iespējama deallokācija | Mazāk droša (fatāla kļūda piekļūstot deallokētam) |
| Tips | Jābūt opcionalam | Nevar būt opcionala |
| Lietošana | Stipro saistību ciklu novēršana, ja objekts var tikt deallokēts agrāk | Stipro saistību ciklu novēršana, ja objekts ir garantēti pastāvīgs |
Piemērs weak izmantošanai, lai novērstu stipro saistību ciklu:
class Person {
let name: String
weak var apartment: Apartment? // vājināta saite, lai novērstu ciklu
init(name: String) {
self.name = name
print("\(name) sāk darboties")
}
deinit {
print("\(name) beidz darboties")
}
}
class Apartment {
let unit: String
var occupant: Person?
init(unit: String) {
self.unit = unit
print("Apartment \(unit) sāk darboties")
}
deinit {
print("Apartment \(unit) beidz darboties")
}
}
Piemērs unowned izmantošanai, fiksējot self slēdzienā:
class HTMLElement {
let name: String
let text: String?
lazy var asHTML: () -> String = {
[unowned self] in // unowned self, lai novērstu cikla veidošanos
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) beidz darboties")
}
}