Sobes.tech
Junior — Middle

Em que situação é preferível usar weak ou unowned para gerir a memória numa equipa de desenvolvedores?

sobes.tech IA

Resposta da IA

No iOS, para gerir a memória com ARC (Contagem Automática de Referências), usam-se referências fracas (weak) e não seguras (unowned) para evitar ciclos de retenção de objetos.

  • weak é usado quando a referência pode tornar-se nil em algum momento, ou seja, o objeto ao qual se refere pode ser eliminado. A referência fraca é automaticamente definida como nil quando o objeto é libertado. Isto é adequado quando a relação não é obrigatória e o objeto pode desaparecer.

  • unowned é usado quando a referência deve sempre apontar para um objeto existente e não pode ser nil. Se o objeto for libertado e a referência unowned permanecer, isso causará um erro em tempo de execução. Normalmente, usa-se unowned quando o ciclo de vida do objeto referenciado é garantido que será mais longo do que o do proprietário da referência.

Exemplo:

class Parent {
    var child: Child?
}

class Child {
    weak var parent: Parent? // weak, pois o parent pode ser eliminado antes
}

// Ou

class Customer {
    let card: CreditCard
    init() {
        card = CreditCard(customer: self)
    }
}

class CreditCard {
    unowned let customer: Customer // unowned, pois o cartão não pode existir sem o cliente
    init(customer: Customer) {
        self.customer = customer
    }
}

Resumo:

  • Use weak quando a referência pode tornar-se nil e deseja evitar ciclos de retenção.
  • Use unowned quando a referência deve sempre ser válida e o objeto existe por mais tempo do que a referência.