Sobes.tech
Junior — Middle

Em que casos é preferível usar unowned em vez de weak na gestão de memória?

sobes.tech IA

Resposta da IA

Em Swift, weak e unowned são usados para evitar ciclos de referências fortes, mas aplicam-se em situações diferentes:

  • weak é uma referência opcional que se torna automaticamente nil quando o objeto ao qual se refere é libertado. É usada quando a referência pode tornar-se nil durante a vida do objeto.

  • unowned é uma referência não opcional que assume que o objeto ao qual se refere sempre existirá durante o uso dessa referência. Se o objeto for libertado, o acesso a unowned provocará um erro em tempo de execução.

Prefere-se usar unowned quando:

  • A referência deve sempre apontar para um objeto existente (por exemplo, um objeto pai que vive mais do que o filho).
  • Tem certeza de que a duração de vida do objeto ao qual se refere não será menor do que a duração da referência.

Exemplo:

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)

Aqui, CreditCard tem uma referência unowned a Customer, porque o cartão não pode existir sem o cliente, e o cliente vive mais do que o cartão.