Sobes.tech
Junior

Qu'est-ce que le modificateur de mémoire weak en Swift?

sobes.tech IA

Réponse de l'IA

Le modificateur weak est utilisé pour briser les cycles de références fortes entre objets, lorsqu'un objet a une référence forte à un autre, et que celui-ci a également une référence forte en retour.

Caractéristiques principales de weak :

  • N'augmente pas le compteur de références : L'utilisation de weak n'augmente pas le nombre de références fortes à l'objet.
  • Peut être nil : La référence faible est optionnelle (Optional) et devient automatiquement nil lorsque l'objet référencé est désinitialisé.
  • Utilisé pour parent/enfant : Souvent appliqué lorsque l'objet enfant a une référence à son parent pour éviter les cycles de références fortes.
  • Doit être déclaré comme var : Étant donné que la référence faible peut devenir nil, elle doit être une variable (var), et non une constante (let).

Exemple d'utilisation :

class Person {
    let name: String
    var apartment: Apartment?

    init(name: String) {
        self.name = name
        print("\(name) est en cours d'initialisation")
    }

    deinit {
        print("\(name) est en train d'être désinitialisé")
    }
}

class Apartment {
    let unit: String
    weak var tenant: Person? // Référence faible

    init(unit: String) {
        self.unit = unit
        print("Appartement \(unit) est en cours d'initialisation")
    }

    deinit {
        print("Appartement \(unit) est en train d'être désinitialisé")
    }
}

Sans weak var tenant: Person? dans la classe Apartment, il y aurait un cycle de références fortes, et les instances de Person et Apartment ne seraient pas désinitialisées lorsqu'elles ne sont plus référencées par d'autres références fortes. Grâce à weak, lorsque l'instance de Person est désinitialisée, la référence tenant dans l'instance de Apartment devient automatiquement nil.