Sobes.tech
Junior — Middle

Como é que a memória de objetos com referências cíclicas é libertada em ambientes geridos?

sobes.tech IA

Resposta da IA

Em ambientes geridos, como o iOS com ARC (Contagem Automática de Referências), a libertação de memória para objetos com referências cíclicas não ocorre automaticamente, pois o ARC não consegue quebrar os ciclos de referências.

Para resolver este problema, usam-se referências fracas (weak) e sem proprietário (unowned), que não aumentam o contador de referências do objeto. Isto permite quebrar os ciclos e libertar a memória corretamente.

Exemplo:

class Person {
    var name: String
    weak var apartment: Apartment? // referência fraca

    init(name: String) {
        self.name = name
    }
}

class Apartment {
    let unit: String
    unowned let tenant: Person // referência sem proprietário

    init(unit: String, tenant: Person) {
        self.unit = unit
        self.tenant = tenant
    }
}

Aqui, Person e Apartment referenciam-se mutuamente, mas uma das referências é fraca, o que impede fugas de memória.

Se os ciclos de referências não forem quebrados, os objetos permanecerão na memória apesar de não existirem referências externas, o que levará a fugas de memória.