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

codebymattz

Matheus Ferreira da Silva Nascimento

Posted on August 7, 2024

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.

💖 💪 🙅 🚩
codebymattz
Matheus Ferreira da Silva Nascimento

Posted on August 7, 2024

Join Our Newsletter. No Spam, Only the good stuff.

Sign up to receive the latest update from our blog.

Related