Middle
Co je to unowned v jazyce Swift a jak se používá?
sobes.tech AI
Odpověď od AI
Neposedný odkaz (slabé nepriamé vlastníctvo) v Swift sa používa na zabránenie cyklov silného vlastníctva (retain cycles), keď si dva objekty navzájom silno odkazujú, čím bránia ich uvoľneniu z pamäte.
Vlastnosti unowned:
- Zaručuje, že objekt, na ktorý odkazuje
unownedodkaz, vždy existuje do okamihu použitia tohto odkazu. - Ak sa pokúsite pristúpiť k
unownedodkazu po tom, čo bol súvisiaci objekt uvoľnený, dôjde k runtime chybe (crash pri behu). - Používa sa, keď životný cyklus odkazujúceho objektu nie je dlhší ako životný cyklus objektu, na ktorý odkazuje. Inými slovami, odkaz s
unownedne robí objekt silnejším.
Príklad použitia v zachytení uzávierky:
class Customer {
let name: String
var card: CreditCard?
init(name: String) {
self.name = name
}
deinit {
print("\(name) je uvoľnený")
}
}
class CreditCard {
let number: UInt64
unowned let customer: Customer // Nevlastnícky odkaz na Customer
init(number: UInt64, customer: Customer) {
self.number = number
self.customer = customer
}
deinit {
print("Karta #\(number) je uvoľnená")
}
}
var john: Customer? // Voliteľný Customer na uvoľnenie
john = Customer(name: "John Appleseed")
john!.card = CreditCard(number: 1234_5678_9012_3456, customer: john!)
// Priradenie nil k john povedie k uvoľneniu Customer a Card,
// pretože nie je žiadny silný cyklus vlastníctva
john = nil
Ďalší príklad - použitie unowned v zozname zachytenia uzávierky:
class HTMLElement {
let name: String
let text: String?
lazy var asHTML: () -> String = { [unowned self] in // Použitie 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) je uvoľnený")
}
}
var paragraph: HTMLElement? // Voliteľný HTML prvok
paragraph = HTMLElement(name: "p", text: "ahoj svet")
print(paragraph!.asHTML())
// Priradenie nil uvoľní HTMLElement, pretože uzávierka ho nedržia silno
paragraph = nil
Voľba medzi unowned a weak závisí od toho, či odkaz môže byť nil počas životnosti objektu. Ak odkaz nikdy nemôže byť nil pred uvoľnením objektu, použite unowned. Ak môže, použite weak.