Sobes.tech
Junior — Middle

V jakých případech je vhodnější použít unowned místo weak při správě paměti?

sobes.tech AI

Odpověď od AI

Ve Swiftu se weak a unowned používají k prevenci silných referenčních cyklů, ale jsou aplikovány v různých situacích:

  • weak je volitelná reference, která se automaticky nastaví na nil, když je objekt, na který odkazuje, uvolněn. Používá se, když může během života objektu dojít k nil.

  • unowned je nevolitelná reference, která předpokládá, že objekt, na který odkazuje, bude vždy existovat během používání této reference. Pokud je objekt uvolněn, přístup k unowned způsobí chybu za běhu.

Preferuje se používat unowned, když:

  • Reference by měla vždy ukazovat na existující objekt (například rodičovský objekt, který žije déle než dítě).
  • Jste si jisti, že životnost objektu, na který odkazujete, nebude kratší než životnost reference.

Příklad:

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)

Zde má CreditCard nevolitelnou referenci unowned na Customer, protože karta nemůže existovat bez zákazníka, a zákazník žije déle než karta.