Comment la mémoire des objets avec des références cycliques est-elle libérée dans les environnements gérés?
sobes.tech IA
Réponse de l'IA
Dans les environnements gérés, comme iOS avec ARC ( comptage automatique des références), la libération de mémoire pour les objets avec des références cycliques ne se produit pas automatiquement, car ARC ne peut pas rompre les cycles de références.
Pour résoudre ce problème, on utilise des références faibles (weak) et sans propriétaire (unowned), qui n'augmentent pas le compteur de références de l'objet. Cela permet de rompre les cycles et de libérer la mémoire correctement.
Exemple :
class Person {
var name: String
weak var apartment: Apartment? // référence faible
init(name: String) {
self.name = name
}
}
class Apartment {
let unit: String
unowned let tenant: Person // référence sans propriétaire
init(unit: String, tenant: Person) {
self.unit = unit
self.tenant = tenant
}
}
Ici, Person et Apartment se réfèrent mutuellement, mais une des références est faible, ce qui empêche les fuites de mémoire.
Si les cycles de références ne sont pas rompus, les objets resteront en mémoire malgré l'absence de références externes, ce qui entraînera des fuites.