Middle
Kas ir unowned Swift valodā un kā tas tiek izmantots?
sobes.tech AI
Atbilde no AI
Neposedinā atsauce (vājā netiešā īpašuma pārvaldība) Swift tiek izmantota, lai izvairītos no stipru atsauces cikliem (retain cycles), kad divi objekti stipri atsaucas viens uz otru, novēršot to atbrīvošanu no atmiņas.
unowned īpašības:
- Nodrošina, ka objekts, uz kuru attiecas
unownedatsauce, vienmēr pastāvēs līdz brīdim, kad tā tiks izmantota. - Ja mēģināsiet piekļūt
unownedatsaucei pēc tam, kad saistītais objekts ir atbrīvots, notiks izpildes kļūda (runtime crash). - To izmanto, kad atsauces objekta dzīves cikls nav ilgāks par atsauces objekta dzīves ciklu. Citiem vārdiem,
unownedatsauce nepadara objektu stiprāku.
Piemērs ar slēptu aizturēšanu:
class Customer {
let name: String
var card: CreditCard?
init(name: String) {
self.name = name
}
deinit {
print("\(name) tiek atbrīvots")
}
}
class CreditCard {
let number: UInt64
unowned let customer: Customer // `unowned` atsauce uz Customer
init(number: UInt64, customer: Customer) {
self.number = number
self.customer = customer
}
deinit {
print("Karte #\(number) tiek atbrīvota")
}
}
var john: Customer? // Opcijonāls Customer
john = Customer(name: "John Appleseed")
john!.card = CreditCard(number: 1234_5678_9012_3456, customer: john!)
// Ja piešķirsim nil, Customer un Card tiks atbrīvoti,
// jo nav stipra cikla
john = nil
Vēl viens piemērs — unowned izmantošana slēptā:
class HTMLElement {
let name: String
let text: String?
lazy var asHTML: () -> String = { [unowned self] in // Izmantojot 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) tiek atbrīvots")
}
}
var paragraph: HTMLElement? // Opcijonāls HTML elements
paragraph = HTMLElement(name: "p", text: "hello world")
print(paragraph!.asHTML())
// Ja piešķirsim nil, HTMLElement tiks atbrīvots, jo slēptā neuztur to stipri
paragraph = nil
Izvēle starp unowned un weak ir atkarīga no tā, vai atsauce var kļūt par nil dzīves laikā. Ja atsauce nekad nevar kļūt par nil pirms objekta atbrīvošanas, izmantojiet unowned. Ja var — izmantojiet weak.