DEV Community

Você sabe a diferença entre Weak e Unowned?

Recentemente, me fizeram essa pergunta em uma entrevista. Fiquei pensando sobre isso e percebi que, apesar de ser um tópico super interessante, muitas vezes a galera que está começando pode acabar deixando isso passar batido no cronograma de estudos. Com base nisso, resolvi escrever esse artigo pra compartilhar conhecimento e também consolidar o meu.

Uma dica: Escreva smart notes em post-it's, para fixar o conhecimento, principalmente sobre tópicos como esse.

Quando estamos falando sobre referencias de memória, é essencial que você tenha conhecimento sobre o ARC (Automatic Reference Counting) e seu funcionamento.

O que é ARC?

Antes de falar sobre weak e unowned, é importante entender o ARC (Automatic Reference Counting). O ARC é um sistema que Swift usa para gerenciar a memória dos objetos automaticamente. Ele rastreia quantas vezes um objeto é referenciado e o desaloca da memória quando não há mais referências a ele.

Referências weak (Fraca)

Imagine que Pikachu e Ash são amigos em uma jornada Pokémon.

Referência Fraca: Pikachu tem uma ligação fraca com Ash. Se Ash decidir ir para longe, Pikachu não tenta impedi-lo nem mantém o espaço ocupado por Ash.

class Pokemon {
    weak var amigo: Pokemon?
}

var pikachu: Pokemon? = Pokemon()
var ash: Pokemon? = Pokemon()
pikachu?.amigo = ash
ash?.amigo = pikachu

pikachu = nil
// ash?.amigo agora é nil porque pikachu foi desalocado
Enter fullscreen mode Exit fullscreen mode

Quando usar weak?

Ciclos de Referência: Usamos weak quando queremos evitar ciclos de referência. Isso acontece quando dois objetos referenciam um ao outro, impedindo que o ARC desaloque algum deles.

Evitar Vazamentos de Memória: Como weak não mantém o objeto na memória, ele é ideal para situações onde o objeto referenciado pode ser desalocado sem problemas.

Reference unowned (Não Própria)

Agora, imagine que um time de futebol tem um técnico.

Referência Não Própria: O técnico do time tem uma ligação com um jogador estrela, acreditando que esse jogador sempre estará lá enquanto o técnico precisar dele. Se o jogador for transferido para outro time, isso pode causar um problema.

class Jogador {
    var tecnico: Tecnico?
    init(tecnico: Tecnico) {
        self.tecnico = tecnico
    }
}

class Tecnico {
    unowned var jogadorEstrela: Jogador
    init(jogadorEstrela: Jogador) {
        self.jogadorEstrela = jogadorEstrela
    }
}

var messi: Jogador? = Jogador(tecnico: Tecnico(jogadorEstrela: messi!))

messi = nil
// Acessar tecnico?.jogadorEstrela agora causará um erro porque messi foi desalocado
Enter fullscreen mode Exit fullscreen mode

Quando usar unowned?

Garantia de Existência: Usamos unowned quando temos certeza de que o objeto referenciado estará na memória enquanto a referência existir.

Relacionamentos Mestre-Detalhe: Ideal para situações onde um objeto principal (mestre) garante a existência do objeto referenciado (detalhe).

Resumo

Weak (Fraco):
Não mantém o objeto na memória.
Referência opcional (Optional), pode se tornar nil.
Usado quando o ciclo de vida do objeto referenciado pode ser mais curto.

Unowned (Não Próprio):
Não mantém o objeto na memória.
Referência não opcional, nunca pode se tornar nil.
Usado quando o ciclo de vida do objeto referenciado é garantido ser igual ou maior.

Conclusão

Espero que esta explicação ajude a esclarecer a diferença entre weak e unowned!

Sucesso na sua trajetória! Beba água e tenha fé em si mesmo, sempre.

Top comments (0)