Sobes.tech
Junior

Kde sa ukladajú typy údajov v Swift?

sobes.tech AI

Odpoveď od AI

Typy údajov v Swift sa ukladajú v dvoch hlavných oblastiach pamäte: zásobníku a halde.

Zásobník

  • Typy hodnôt (value types):
    • struct (štruktúry)
    • enum (výčty)
    • Základné typy, ako napríklad Int, Double, Bool, String (krátke reťazce môžu byť uložené priamo v zásobníku pre optimalizáciu)
  • Dáta sa ukladajú priamo v zásobníku v poradí vykonávania funkcií.
  • Pridelenie a uvoľnenie pamäte prebieha automaticky a veľmi rýchlo (LIFO - Last In, First Out).

Haldy

  • Referenčné typy (reference types):
    • class (triedy)
    • Funkcie a uzávery (Closures)
    • Objekt (AnyObject)
  • Objekty samy sú uložené v halde, zatiaľ čo v zásobníku sú len odkazy na ne.
  • Pridelenie a uvoľnenie pamäte v halde prebieha dynamicky a je riadené systémom (Automatic Reference Counting - ARC).
  • Prístup k dátam v halde je nepriamy, cez ukazovateľ.

Vlastnosti

  • Pri priraďovaní hodnotového typu sa kopíruje celá hodnota.
  • Pri priraďovaní referenčného typu sa kopíruje len odkaz, a oba objekty ukazujú na rovnakú oblasť pamäte v halde.
  • ARC sleduje počet silných odkazov na objekty v halde a automaticky uvoľňuje pamäť, keď odkazov už nie je.
// Príklad hodnotového typu - uloženého v zásobníku
struct Point {
    var x: Int
    var y: Int
}

var p1 = Point(x: 10, y: 20)
var p2 = p1 // Celá hodnota sa kopíruje

p2.x = 30 // p1 sa nemení
print("p1: \(p1), p2: \(p2)") // Výstup: p1: Point(x: 10, y: 20), p2: Point(x: 30, y: 20)

// Príklad referenčného typu - uloženého v halde
class Circle {
    var radius: Double

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

var c1 = Circle(radius: 5.0)
var c2 = c1 // Len odkaz sa kopíruje

c2.radius = 10.0 // c1 sa tiež mení, pretože obidva ukazujú na ten istý objekt v halde
print("c1.radius: \(c1.radius), c2.radius: \(c2.radius)") // Výstup: c1.radius: 10.0, c2.radius: 10.0