Sobes.tech
Junior

Quelle est la différence entre liens faibles et forts?

sobes.tech IA

Réponse de l'IA

La différence dans le mécanisme de gestion de la mémoire (ARC - comptage automatique des références).

  • Référence forte (Strong reference): Augmente le compteur de références de l'objet de 1. L'objet ne peut pas être libéré de la mémoire tant qu'il existe au moins une référence forte à lui. Ce comportement est par défaut pour les propriétés et variables en Swift.

  • Référence faible (Weak reference): N'augmente pas le compteur de références de l'objet. Utilisée pour prévenir les références cycliques, lorsque deux ou plusieurs objets ont des références fortes entre eux, créant une fuite de mémoire. Les références faibles sont toujours optionnelles (Optional), car l'objet auquel elles font référence peut être désalloué à tout moment. Si l'objet est libéré, la référence faible devient automatiquement nil.

Exemple de référence cyclique et sa prévention avec une référence faible:

class Person {
    let name: String
    var apartment: Apartment? // Référence forte ici initialement
    init(name: String) { self.name = name }
    deinit { print("\(name) est en train d'être désinitialisé") }
}

class Apartment {
    let unit: String
    weak var tenant: Person? // Référence faible ici
    init(unit: String) { self.unit = unit }
    deinit { print("Appartement \(unit) est en train d'être désinitialisé") }
}

var john: Person? // Instance de Person
var unit4A: Apartment? // Instance de Apartment

john = Person(name: "John Appleseed")
unit4A = Apartment(unit: "4A")

// Création d'un cycle de référence forte:
// john a une référence forte à l'appartement
// l'appartement a une référence forte à la personne
john!.apartment = unit4A
unit4A!.tenant = john // Cela doit être faible pour briser le cycle

john = nil // Mettre john à nil ne le désallouera pas si le cycle existe
unit4A = nil // Mettre unit4A à nil ne le désallouera pas si le cycle existe

// Sortie attendue lors de l'utilisation de la référence faible pour le locataire:
// John Appleseed est en train d'être désinitialisé
// Appartement 4A est en train d'être désinitialisé

Sans weak pour tenant, les destructeurs ne seraient pas appelés, ce qui indique une fuite de mémoire.