Junior
Où sont stockés les types de données dans Swift?
sobes.tech IA
Réponse de l'IA
Les types de données en Swift sont stockés dans deux zones principales de mémoire : la pile et le tas.
La pile
- Types de valeur (types de valeur) :
struct(structures)enum(énumérations)- Types de base, comme
Int,Double,Bool,String(les chaînes courtes peuvent être stockées directement dans la pile pour optimisation)
- Les données sont stockées directement dans la pile dans l'ordre d'exécution des fonctions.
- L'allocation et la libération de mémoire se font automatiquement et très rapidement (LIFO - Last In, First Out).
Le tas
- Types de référence (types de référence) :
class(classes)- Fonctions et closures
- Objets (
AnyObject)
- Les objets eux-mêmes sont stockés dans le tas, et la pile ne contient que des références à eux.
- L'allocation et la libération de mémoire dans le tas se font de manière dynamique et sont gérées par le système (Automatic Reference Counting - ARC).
- L'accès aux données dans le tas est indirect, via un pointeur.
Caractéristiques
- Lors de l'assignation d'un type de valeur, toute la valeur est copiée.
- Lors de l'assignation d'un type de référence, seule la référence est copiée, et les deux objets pointent vers la même zone de mémoire dans le tas.
- ARC suit le nombre de références fortes aux objets dans le tas et libère automatiquement la mémoire lorsque le nombre de références tombe à zéro.
// Exemple de type de valeur - stocké dans la pile
struct Point {
var x: Int
var y: Int
}
var p1 = Point(x: 10, y: 20)
var p2 = p1 // Toute la valeur est copiée
p2.x = 30 // p1 ne change pas
print("p1: \(p1), p2: \(p2)") // Résultat : p1: Point(x: 10, y: 20), p2: Point(x: 30, y: 20)
// Exemple de type de référence - stocké dans le tas
class Circle {
var radius: Double
init(radius: Double) {
self.radius = radius
}
}
var c1 = Circle(radius: 5.0)
var c2 = c1 // Seule la référence est copiée
c2.radius = 10.0 // c1 change aussi, car ils pointent tous deux vers le même objet dans le tas
print("c1.radius: \(c1.radius), c2.radius: \(c2.radius)") // Résultat : c1.radius: 10.0, c2.radius: 10.0