Sobes.tech
Middle

Quelle est la différence entre le ramasse-miettes (garbage collector) et la gestion automatique de la mémoire (ARC) ?

sobes.tech IA

Réponse de l'IA

Le ramasse-miettes trouve et libère automatiquement la mémoire qui n'est plus utilisée par le programme. Il fonctionne en arrière-plan, scannant périodiquement le tas et identifiant les objets sans références actives.

ARC ( comptage automatique de références) en Swift et Objective-C gère la durée de vie des objets en comptant le nombre de références fortes à chaque objet. Dès que le nombre de références fortes d'un objet atteint zéro, ARC libère automatiquement la mémoire occupée par cet objet.

Principales différences:

Caractéristique Ramasse-miettes ARC
Principe de fonctionnement Recherche d'objets inaccessibles Comptage de références fortes
Moment de libération Non déterministe, lors du scan Déterministe, lorsque le compteur atteint 0
Coûts supplémentaires Pauses lors de l'exécution (pendant la collecte) Minimes, lors de la modification du compteur
Prévisibilité Faible Élevée
Références cycliques Nécessitent des approches spéciales (par exemple, références faibles) Nécessitent l'utilisation de références weak ou unowned
Utilisation en iOS Absente dans Objective-C et Swift modernes Mécanisme principal de gestion de la mémoire en Objective-C et Swift

Exemple d'utilisation de weak pour prévenir les cycles de références fortes dans ARC:

class Person {
    let name: String
    var apartment: Apartment? // référence forte

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

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 cours de désinitialisation")
    }
}

var john: Person?
var unit4A: Apartment?

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

john!.apartment = unit4A
unit4A!.tenant = john // référence faible empêche le cycle de rétention

john = nil // L'objet Person est désinitialisé
unit4A = nil // L'objet Apartment est désinitialisé