Sobes.tech
Junior

Unde sunt stocate tipurile de date în Swift?

sobes.tech AI

Răspuns de la AI

Tipurile de date din Swift sunt stocate în două zone principale de memorie: stivă și heap.

Stivă

  • Tipuri de valoare (tipuri de valoare):
    • struct (structuri)
    • enum (enumerații)
    • Tipuri de bază, cum ar fi Int, Double, Bool, String (șirurile scurte pot fi stocate direct în stivă pentru optimizare)
  • Datele sunt stocate direct în stivă în ordinea execuției funcțiilor.
  • Alocarea și eliberarea memoriei se face automat și foarte rapid (LIFO - Last In, First Out).

Heap

  • Tipuri de referință (tipuri de referință):
    • class (clase)
    • Funcții și closures
    • Obiecte (AnyObject)
  • Obiectele în sine sunt stocate în heap, iar în stivă există doar referințe către ele.
  • Alocarea și eliberarea memoriei în heap se face dinamic și este gestionată de sistem (Automatic Reference Counting - ARC).
  • Accesul la datele din heap este indirect, printr-un pointer.

Caracteristici

  • La atribuirea unui tip de valoare, întreaga valoare este copiată.
  • La atribuirea unui tip de referință, se copiază doar referința, și ambele obiecte indică către aceeași zonă de memorie în heap.
  • ARC urmărește numărul de referințe puternice către obiecte în heap și eliberează automat memoria când nu mai există referințe.
// Exemplu de tip de valoare - stocat în stivă
struct Point {
    var x: Int
    var y: Int
}

var p1 = Point(x: 10, y: 20)
var p2 = p1 // Întreaga valoare este copiată

p2.x = 30 // p1 nu se schimbă
print("p1: \(p1), p2: \(p2)") // Output: p1: Point(x: 10, y: 20), p2: Point(x: 30, y: 20)

// Exemplu de tip de referință - stocat în heap
class Circle {
    var radius: Double

    init(radius: Double) {
        self.radius = radius
    }
}

var c1 = Circle(radius: 5.0)
var c2 = c1 // Doar referința este copiată

c2.radius = 10.0 // c1 se schimbă și el, deoarece ambele indică același obiect în heap
print("c1.radius: \(c1.radius), c2.radius: \(c2.radius)") // Output: c1.radius: 10.0, c2.radius: 10.0