Sobes.tech
Junior — Middle

Qual é a diferença entre referências Weak e Unowned na gestão de memória?

sobes.tech IA

Resposta da IA

Em Swift, as referências do tipo weak e unowned são usadas para evitar ciclos de referências fortes (ciclos de retenção) na gestão de memória, mas diferem em comportamento e aplicação.

  • Weak (referência fraca):

    • Pode ser nil.
    • Declarada como um tipo opcional (var delegate: SomeDelegate? weak).
    • Usada quando a referência pode tornar-se nil durante a vida do objeto, por exemplo, delegados.
    • O sistema automaticamente define a referência weak como nil quando o objeto referenciado é libertado.
  • Unowned (sem proprietário):

    • Não pode ser nil (tipo não opcional).
    • Usada quando a referência existe garantidamente durante a vida do objeto, por exemplo, entre um pai e um filho.
    • Se o objeto referenciado por unowned já tiver sido libertado, uma tentativa de acesso causará um erro em tempo de execução (crash).

Exemplo:

class Person {
    var apartment: Apartment?
}

class Apartment {
    unowned let tenant: Person
    init(tenant: Person) {
        self.tenant = tenant
    }
}

// Aqui, `tenant` é `unowned`, pois um apartamento não pode existir sem um inquilino.

class DelegateHolder {
    weak var delegate: SomeDelegate?
}

// O delegado é `weak`, pois pode ser libertado antes.

Assim, weak é adequado para referências que podem tornar-se nil, e unowned para referências que devem estar sempre válidas durante a vida do objeto.