Sobes.tech
Junior

Hol tárolódnak az adatsípusok a Swiftben?

sobes.tech MI

Válasz az MI-től

A Swiftben lévő adattípusokat két fő memória terület tárolja: a verem és a halom.

Verem

  • Értéktípusok (value types):
    • struct (struktúrák)
    • enum (felsorolások)
    • Alapvető típusok, mint például Int, Double, Bool, String (rövid szövegek közvetlenül a veremben tárolhatók az optimalizáció érdekében)
  • Az adatok közvetlenül a veremben tárolódnak a függvények végrehajtási sorrendjében.
  • A memória foglalása és felszabadítása automatikusan és nagyon gyorsan történik (LIFO - Last In, First Out).

Halom

  • Referencia típusok (reference types):
    • class (osztályok)
    • Funkciók és lezárások (Closures)
    • Objektumok (AnyObject)
  • Az objektumok maguk a halomban tárolódnak, míg a veremben csak hivatkozások találhatók rájuk.
  • A memória foglalása és felszabadítása dinamikusan történik, és a rendszer kezeli (Automatic Reference Counting - ARC).
  • A halomban lévő adatokhoz való hozzáférés közvetett, mutató segítségével.

Jellemzők

  • Értéktípus hozzárendelésekor az egész érték másolódik.
  • Referenciatípus hozzárendelésekor csak a hivatkozás másolódik, és mindkét objektum ugyanarra a memória területre mutat a halomban.
  • Az ARC nyomon követi a halomban lévő objektumokra mutató erős hivatkozások számát, és automatikusan felszabadítja a memóriát, amikor már nincs rájuk hivatkozás.
// Értéktípus példája - a veremben tárolódik
struct Point {
    var x: Int
    var y: Int
}

var p1 = Point(x: 10, y: 20)
var p2 = p1 // Az egész érték másolódik

p2.x = 30 // p1 nem változik
print("p1: \(p1), p2: \(p2)") // Kimenet: p1: Point(x: 10, y: 20), p2: Point(x: 30, y: 20)

// Referenciatípus példája - a halomban tárolódik
class Circle {
    var radius: Double

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

var c1 = Circle(radius: 5.0)
var c2 = c1 // Csak a hivatkozás másolódik

c2.radius = 10.0 // c1 is változik, mivel mindkettő ugyanarra az objektumra mutat a halomban
print("c1.radius: \(c1.radius), c2.radius: \(c2.radius)") // Kimenet: c1.radius: 10.0, c2.radius: 10.0