Sobes.tech
Junior

Waar worden de gegevenstypen opgeslagen in Swift?

sobes.tech AI

Antwoord van AI

De datatype in Swift worden opgeslagen in twee hoofdgebieden van het geheugen: de stack en de heap.

Stack

  • Waarde types (waarde types):
    • struct (structuren)
    • enum (enumeraties)
    • Basis types, zoals Int, Double, Bool, String (korte strings kunnen direct in de stack worden opgeslagen voor optimalisatie)
  • Gegevens worden direct in de stack opgeslagen in de volgorde van functie-uitvoering.
  • Toewijzing en vrijgave van geheugen gebeurt automatisch en zeer snel (LIFO - Last In, First Out).

Heap

  • Referentietypes (referentietypes):
    • class (klassen)
    • Functies en closures
    • Objecten (AnyObject)
  • De objecten zelf worden in de heap opgeslagen, en in de stack bevinden zich alleen verwijzingen naar hen.
  • Toewijzing en vrijgave van geheugen in de heap gebeurt dynamisch en wordt beheerd door het systeem (Automatic Reference Counting - ARC).
  • Toegang tot gegevens in de heap is indirect, via een pointer.

Kenmerken

  • Bij het toewijzen van een waardetype wordt de hele waarde gekopieerd.
  • Bij het toewijzen van een referentietype wordt alleen de referentie gekopieerd, en beide objecten wijzen naar hetzelfde geheugengebied in de heap.
  • ARC houdt het aantal sterke verwijzingen naar objecten in de heap bij en vrijmaakt automatisch het geheugen wanneer er geen verwijzingen meer zijn.
// Voorbeeld van een waardetype - opgeslagen in de stack
struct Point {
    var x: Int
    var y: Int
}

var p1 = Point(x: 10, y: 20)
var p2 = p1 // De hele waarde wordt gekopieerd

p2.x = 30 // p1 verandert niet
print("p1: \(p1), p2: \(p2)") // Output: p1: Point(x: 10, y: 20), p2: Point(x: 30, y: 20)

// Voorbeeld van een referentietype - opgeslagen in de heap
class Circle {
    var radius: Double

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

var c1 = Circle(radius: 5.0)
var c2 = c1 // Alleen de referentie wordt gekopieerd

c2.radius = 10.0 // c1 verandert ook, omdat beide naar hetzelfde object in de heap wijzen
print("c1.radius: \(c1.radius), c2.radius: \(c2.radius)") // Output: c1.radius: 10.0, c2.radius: 10.0