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