Sobes.tech
Junior

Къде се съхраняват типовете данни в Swift?

sobes.tech AI

Отговор от AI

Типовете данни в Swift се съхраняват в две основни области на паметта: стека и купчината.

Стек

  • Типове стойност (value types):
    • struct (структури)
    • enum (енумерации)
    • Основни типове като Int, Double, Bool, String (кратките низове могат да се съхраняват директно в стека за оптимизация)
  • Данните се съхраняват директно в стека в реда на изпълнение на функциите.
  • Разпределянето и освобождаването на паметта става автоматично и много бързо (LIFO - Last In, First Out).

Купчина

  • Типове препратка (reference types):
    • class (класове)
    • Функции и затваряния (Closures)
    • Обекти (AnyObject)
  • Обектите сами по себе си се съхраняват в купчината, а в стека има само препратки към тях.
  • Разпределянето и освобождаването на паметта в купчината става динамично и се управлява от системата (Automatic Reference Counting - ARC).
  • Достъпът до данните в купчината е косвен, чрез указател.

Характеристики

  • При присвояване на стойностен тип, цялата стойност се копира.
  • При присвояване на препратков тип, се копира само препратката, и двата обекта сочат към една и съща област на паметта в купчината.
  • ARC следи броя на силните препратки към обектите в купчината и автоматично освобождава паметта, когато няма повече препратки.
// Пример за стойностен тип - съхранява се в стека
struct Point {
    var x: Int
    var y: Int
}

var p1 = Point(x: 10, y: 20)
var p2 = p1 // Цялата стойност се копира

p2.x = 30 // p1 не се променя
print("p1: \(p1), p2: \(p2)") // Изход: p1: Point(x: 10, y: 20), p2: Point(x: 30, y: 20)

// Пример за препратков тип - съхранява се в купчината
class Circle {
    var radius: Double

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

var c1 = Circle(radius: 5.0)
var c2 = c1 // Само препратката се копира

c2.radius = 10.0 // и c1 се променя, тъй като и двата сочат към един и същи обект в купчината
print("c1.radius: \(c1.radius), c2.radius: \(c2.radius)") // Изход: c1.radius: 10.0, c2.radius: 10.0