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.