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
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
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)