Sobes.tech
Junior — Middle

In welchen Fällen ist es vorzuziehen, unowned anstelle von weak in der Speicherverwaltung zu verwenden?

sobes.tech KI

Antwort von AI

In Swift werden weak und unowned verwendet, um starke Referenzzyklen zu vermeiden, aber sie werden in unterschiedlichen Situationen eingesetzt:

  • weak ist eine optionale Referenz, die automatisch nil wird, wenn das referenzierte Objekt freigegeben wird. Sie wird verwendet, wenn die Referenz im Verlauf des Objekts nil werden kann.

  • unowned ist eine nicht-optionale Referenz, die annimmt, dass das referenzierte Objekt während der Nutzung dieser Referenz immer existiert. Wenn das Objekt freigegeben wird, führt der Zugriff auf unowned zu einem Laufzeitfehler.

Es ist vorzuziehen, unowned zu verwenden, wenn:

  • Die Referenz immer auf ein existierendes Objekt zeigen soll (z.B. ein Elternobjekt, das länger lebt als das Kind).
  • Sie sicher sind, dass die Lebensdauer des referenzierten Objekts nicht kürzer ist als die Lebensdauer der Referenz.

Beispiel:

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 hat CreditCard eine unowned-Referenz auf Customer, weil die Karte ohne den Kunden nicht existieren kann, und der Kunde lebt länger als die Karte.