Sobes.tech
Middle — Middle+

Como é que o ciclo de retenção de referências é inicializado nas linguagens de programação geridas por memória?

sobes.tech IA

Resposta da IA

Nos linguagens de programação com gestão automática de memória, como Swift ou Objective-C no iOS, o ciclo de retenção (retain cycle) ocorre quando dois ou mais objetos se mantêm mutuamente através de referências fortes, impedindo que o coletor de lixo ou ARC (Contagem Automática de Referências) libere esses objetos.

O ciclo de retenção inicia-se quando, por exemplo, o objeto A contém uma referência forte ao objeto B, e por sua vez, o objeto B contém uma referência forte ao objeto A. Isso faz com que os contadores de referências de ambos os objetos nunca cheguem a zero.

Para evitar esses ciclos, usam-se:

  • Referências fracas (weak) — não aumentam o contador de referências e são automaticamente definidas como nil quando o objeto referenciado é liberado.
  • Referências não possuidoras (unowned) — não aumentam o contador, mas não são automaticamente definidas como nil, sendo usadas quando se garante que o objeto existe por mais tempo.

Exemplo:

class Person {
    var apartment: Apartment?
}

class Apartment {
    weak var tenant: Person?  // referência fraca para evitar ciclo
}

Dessa forma, o ciclo de retenção é iniciado por referências fortes mútuas, e prevenido usando referências fracas ou não possuidoras para romper o ciclo.