Sobes.tech
Junior — Middle

In welke gevallen is het beter om unowned te gebruiken in plaats van weak bij geheugenbeheer?

sobes.tech AI

Antwoord van AI

In Swift worden weak en unowned gebruikt om sterke referentiecirkels te voorkomen, maar ze worden in verschillende situaties toegepast:

  • weak is een optionele referentie die automatisch nil wordt wanneer het object waarnaar wordt verwezen wordt vrijgegeven. Het wordt gebruikt wanneer de referentie tijdens de levensduur van het object nil kan worden.

  • unowned is een niet-optionele referentie die ervan uitgaat dat het verwezen object altijd zal bestaan tijdens het gebruik van deze referentie. Als het object wordt vrijgegeven, zal toegang tot unowned een runtime-fout veroorzaken.

Het wordt aanbevolen om unowned te gebruiken wanneer:

  • De referentie altijd naar een bestaand object moet wijzen (bijvoorbeeld een ouderobject dat langer leeft dan het kind).
  • Je zeker weet dat de levensduur van het verwezen object niet korter zal zijn dan die van de referentie.

Voorbeeld:

class Customer {
    let name: String
    var card: CreditCard?
    init(name: String) {
        self.name = name
    }
}

class CreditCard {
    let number: UInt64
    unowned let customer: Customer
    init(number: UInt64, customer: Customer) {
        self.number = number
        self.customer = customer
    }
}

let john = Customer(name: "John Appleseed")
john.card = CreditCard(number: 1234_5678_9012_3456, customer: john)

Hier heeft CreditCard een unowned-referentie naar Customer, omdat de kaart niet zonder de klant kan bestaan, en de klant langer leeft dan de kaart.