Sobes.tech
Middle

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: unowned wordt gebruikt wanneer het verweesde object een gelijke of langere levensduur heeft. weak wordt gebruikt wanneer het verweesde object eerder kan worden gedealloceerd.
  • Optional: unowned is niet Optional (behalve als het als unowned optional wordt gedeclareerd). weak is altijd Optional.
  • Veiligheid: Toegang tot een eigenschap met een unowned-verwijzing naar een al gedealloceerd object zal leiden tot een crash. Toegang tot een weak-verwijzing geeft nil terug.

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.