Sobes.tech
Junior

Kde jsou v Swift uloženy datové typy?

sobes.tech AI

Odpověď od AI

Datové typy ve Swiftu jsou uloženy ve dvou hlavních oblastech paměti: zásobníku a haldě.

Zásobník

  • Hodnotové typy (value types):
    • struct (struktury)
    • enum (výčty)
    • Základní typy, jako například Int, Double, Bool, String (krátké řetězce mohou být uloženy přímo na zásobníku pro optimalizaci)
  • Data jsou uložena přímo na zásobníku v pořadí provádění funkcí.
  • Přidělení a uvolnění paměti probíhá automaticky a velmi rychle (LIFO - Last In, First Out).

Haldy

  • Referenční typy (reference types):
    • class (třídy)
    • Funkce a uzávěry (Closures)
    • Objekty (AnyObject)
  • Objekty jsou uloženy přímo na haldě, zatímco na zásobníku jsou pouze odkazy na ně.
  • Přidělení a uvolnění paměti na haldě probíhá dynamicky a je řízeno systémem (Automatic Reference Counting - ARC).
  • Přístup k datům na haldě je nepřímý, přes ukazatel.

Vlastnosti

  • Při přiřazení hodnotového typu je kopírována celá hodnota.
  • Při přiřazení referenčního typu je kopírována pouze reference, a oba objekty ukazují na stejnou oblast paměti na haldě.
  • ARC sleduje počet silných odkazů na objekty na haldě a automaticky uvolňuje paměť, když odkazů nezbývá.
// Příklad hodnotového typu - uloženého na zásobníku
struct Point {
    var x: Int
    var y: Int
}

var p1 = Point(x: 10, y: 20)
var p2 = p1 // Celá hodnota je kopírována

p2.x = 30 // p1 se nemění
print("p1: \(p1), p2: \(p2)") // Výstup: p1: Point(x: 10, y: 20), p2: Point(x: 30, y: 20)

// Příklad referenčního typu - uloženého na haldě
class Circle {
    var radius: Double

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

var c1 = Circle(radius: 5.0)
var c2 = c1 // Pouze reference je kopírována

c2.radius = 10.0 // c1 se také mění, protože oba ukazují na stejný objekt na haldě
print("c1.radius: \(c1.radius), c2.radius: \(c2.radius)") // Výstup: c1.radius: 10.0, c2.radius: 10.0