Sobes.tech
Junior — Middle

W jakich przypadkach lepiej stosować unowned zamiast weak w zarządzaniu pamięcią?

sobes.tech AI

Odpowiedź od AI

W Swift, weak i unowned są używane do zapobiegania cyklom silnych referencji, ale stosuje się je w różnych sytuacjach:

  • weak to opcjonalne odniesienie, które automatycznie staje się nil, gdy obiekt, na który się odwołuje, zostanie zwolniony. Używa się go, gdy odniesienie może stać się nil w trakcie życia obiektu.

  • unowned to nieoptymalne odniesienie, które zakłada, że obiekt, na który się odwołuje, zawsze będzie istniał podczas korzystania z tego odniesienia. Jeśli obiekt zostanie zwolniony, dostęp do unowned spowoduje błąd w czasie wykonywania.

Preferuje się używanie unowned, gdy:

  • Odniesienie zawsze musi wskazywać na istniejący obiekt (np. rodzic, który żyje dłużej niż dziecko).
  • Masz pewność, że czas życia obiektu, na który się odwołujesz, nie będzie krótszy niż czas życia odniesienia.

Przykład:

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)

Tutaj, CreditCard ma nieoptymalne odniesienie unowned do Customer, ponieważ karta nie może istnieć bez klienta, a klient żyje dłużej niż karta.