Sobes.tech
Junior

Kur tiek glabāti datu tipi Swift?

sobes.tech AI

Atbilde no AI

Swift datu tipi tiek glabājas divās galvenajās atmiņas jomās: stekā un kaudzē.

Steks

  • Vērtību tipi (Value types):
    • struct (struktūras)
    • enum (izvēles)
    • Pamattipi, piemēram, Int, Double, Bool, String (īsās rindas var glabāt tieši stekā optimizācijai)
  • Dati tiek glabāti tieši stekā izpildes secībā.
  • Atmiņas piešķiršana un atbrīvošana notiek automātiski un ļoti ātri (LIFO - Last In, First Out).

Kaudze

  • Atsauces tipi (Reference types):
    • class (klases)
    • Funkcijas un slēdži (Closures)
    • Objekti (AnyObject)
  • Objekti tiek glabāti kaudzē, bet stekā — tikai norādes uz tiem.
  • Atmiņas piešķiršana un atbrīvošana notiek dinamiski un ir pārvaldāma sistēmas (Automatic Reference Counting - ARC).
  • Pieeja datiem kaudzē ir netieša, caur norādi.

Īpatnības

  • Piešķirot vērtību tipu, tiek kopēta visa vērtība.
  • Piešķirot atsauces tipu, tiek kopēta tikai norāde, abi objekti norāda uz to pašu atmiņas vietu kaudzē.
  • ARC uzrauga stipro norāžu skaitu uz objektiem kaudzē un automātiski atbrīvo atmiņu, kad norādes vairs nav.
// Piemērs vērtību tipam - glabājas stekā
struct Point {
    var x: Int
    var y: Int
}

var p1 = Point(x: 10, y: 20)
var p2 = p1 // Kopē visa vērtība

p2.x = 30 // p1 nemainās
print("p1: \(p1), p2: \(p2)") // Izvade: p1: Point(x: 10, y: 20), p2: Point(x: 30, y: 20)

// Piemērs atsauces tipam - glabājas kaudzē
class Circle {
    var radius: Double

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

var c1 = Circle(radius: 5.0)
var c2 = c1 // Tikai norāde

c2.radius = 10.0 // c1 arī mainās, jo abi norāda uz to pašu objektu kaudzē
print("c1.radius: \(c1.radius), c2.radius: \(c2.radius)") // Izvade: c1.radius: 10.0, c2.radius: 10.0