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é