Wat is unowned?
sobes.tech AI
Antwoord van AI
unowned — het sleutelwoord in Swift voor het declareren van een zwakke verwijzing. Het wordt gebruikt wanneer twee objecten een sterke relatie hebben en hun levenscycli van elkaar afhankelijk zijn, maar we willen cyclische verwijzingen voorkomen die het vrijmaken van geheugen kunnen belemmeren.
Belangrijkste eigenschappen en verschillen met weak:
- Niet optioneel: De
unownedverwijzing zal gedurende de hele levensduur van het object waarnaar het verwijst nietnilworden. - Sterke relatie: Wordt gebruikt wanneer één object een ander bezit en ze altijd samen bestaan.
- Bij vrijmaken: Als het object waarnaar de
unownedverwijzing verwijst wordt vrijgegeven voordat de verwijzing wordt gebruikt, leidt dit tot een runtime-fout. Het is noodzakelijk om zeker te zijn dat het referentie-object langer bestaat dan de verwijzing zelf. - Toepassing: Wordt vaak gebruikt voor delegates, wanneer de delegate altijd langer bestaat dan het object dat het aanroept, of in closures om cyclische verwijzingen naar
selfte voorkomen wanneer de closureselfniet krachtig vastlegt.
Voorbeeld van gebruik in een closure:
// swift
class MyClass {
var name: String
var closure: (() -> Void)?
init(name: String) {
self.name = name
}
func setupClosure() {
closure = { [unowned self] in // Gebruik van unowned self
print("Mijn naam is \(self.name)")
}
}
deinit {
print("\(name) gedeinitialiseerd")
}
}
Voorbeeld van gebruik voor een delegate (hoewel weak vaker wordt gebruikt voor delegates, is unowned ook mogelijk als de delegate garant langer leeft):
// swift
protocol MyDelegate: AnyObject { // AnyObject vereist een referentietype
func doSomething()
}
class DataSource {
unowned var delegate: MyDelegate // unowned verwijzing naar delegate
init(delegate: MyDelegate) {
self.delegate = delegate
}
func performAction() {
delegate.doSomething()
}
deinit {
print("DataSource gedeinitialiseerd")
}
}
class MyController: MyDelegate {
var dataSource: DataSource?
override init() {
super.init()
dataSource = DataSource(delegate: self)
}
func doSomething() {
print("Delegate-methode aangeroepen")
}
deinit {
print("MyController gedeinitialiseerd")
}
}
De keuze tussen weak en unowned hangt af van of de verwijzing optioneel is en of het object waarnaar wordt verwezen gegarandeerd bestaat tot het einde van de levensduur van de verwijzing. Als het mogelijk is dat het object wordt vrijgegeven voordat de verwijzing wordt gebruikt, moet weak worden gebruikt. Als de aanwezigheid gegarandeerd is en de verwijzing niet optioneel hoeft te zijn, kan unowned worden gebruikt.