Waarvoor dient het type unowned referenties?
sobes.tech AI
Antwoord van AI
Verwijzingen unowned zijn nodig om cyclische verwijzingen (retain cycles) tussen objecten op te lossen, wanneer beide objecten een sterke verwijzing naar elkaar hebben, maar één van de objecten een kortere of gelijke levensduur heeft.
unowned wordt gebruikt wanneer bekend is dat het verweesde object niet nil zal zijn gedurende de hele levensduur van het object dat de verwijzing bevat. In tegenstelling tot weak, wordt bij toegang tot een unowned-verwijzing geen Optional gebruikt. Als het object waarnaar unowned verwijst wordt gedealloceerd voordat het object met de unowned-verwijzing, zal er een crash optreden.
Voorbeeld van gebruik in closures:
class Person {
let name: String
var apartment: Apartment?
init(name: String) {
self.name = name
print("\(name) wordt geïnitialiseerd")
}
deinit {
print("\(name) wordt gedeinitialiseerd")
}
}
class Apartment {
let unit: String
// We gebruiken `unowned` omdat bekend is dat
// het Apartment niet zonder Person kan bestaan
// (in deze context). Person kan nil zijn,
// maar als het Apartment bestaat, bestaat Person ook.
unowned let tenant: Person
init(unit: String, tenant: Person) {
self.unit = unit
self.tenant = tenant
print("Appartement \(unit) wordt geïnitialiseerd")
}
deinit {
print("Appartement \(unit) wordt gedeinitialiseerd")
}
}
var john: Person?
var unit4A: Apartment?
john = Person(name: "John Appleseed")
// In dit voorbeeld kan tenant nil zijn, daarom
// wordt een `unowned`-verwijzing gebruikt
unit4A = Apartment(unit: "4A", tenant: john!)
john!.apartment = unit4A
// Breek de sterke verwijzingen om deallocatie te testen
john = nil
unit4A = nil
In dit voorbeeld heeft Person een sterke verwijzing naar Apartment (var apartment: Apartment?). Apartment zou een sterke verwijzing naar Person kunnen hebben, wat een cyclus zou creëren. Echter, in deze context kan Apartment niet bestaan zonder Person (die het huurt), dus wordt de verwijzing van Apartment naar Person unowned. Zo wordt, wanneer john = nil wordt gezet, Person gedealloceerd, en vervolgens (aangezien er geen sterke verwijzingen naar Apartment zijn) ook Apartment.
Belangrijkste verschillen met weak:
- Levensduur:
unownedwordt gebruikt wanneer het verweesde object een gelijke of langere levensduur heeft.weakwordt gebruikt wanneer het verweesde object eerder kan worden gedealloceerd. - Optional:
unownedis niet Optional (behalve als het alsunowned optionalwordt gedeclareerd).weakis altijd Optional. - Veiligheid: Toegang tot een eigenschap met een
unowned-verwijzing naar een al gedealloceerd object zal leiden tot een crash. Toegang tot eenweak-verwijzing geeftnilterug.
Kortom, unowned is een niet-eigenende (non-owning) verwijzing die wordt gebruikt wanneer de aanwezigheid van het verweesde object gegarandeerd is zolang het object met de unowned-verwijzing bestaat.