Sobes.tech
Junior — Middle

¿En qué casos es preferible usar unowned en lugar de weak en la gestión de memoria?

sobes.tech AI

Respuesta de la IA

En Swift, weak y unowned se utilizan para prevenir ciclos de referencias fuertes, pero se aplican en diferentes situaciones:

  • weak es una referencia opcional que se vuelve automáticamente nil cuando el objeto al que hace referencia se libera. Se usa cuando la referencia puede volverse nil durante la vida del objeto.

  • unowned es una referencia no opcional que asume que el objeto al que hace referencia siempre existirá durante el uso de esa referencia. Si el objeto se libera, acceder a unowned provocará un error en tiempo de ejecución.

Se prefiere usar unowned cuando:

  • La referencia siempre debe apuntar a un objeto existente (por ejemplo, un objeto padre que vive más que el hijo).
  • Estás seguro de que la duración de vida del objeto al que te refieres no será menor que la duración de la referencia.

Ejemplo:

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)

Aquí, CreditCard tiene una referencia unowned a Customer, porque la tarjeta no puede existir sin el cliente, y el cliente vive más que la tarjeta.