Sobes.tech
Junior

Swiftda ma'lumot turlari qayerda saqlanadi?

sobes.tech AI

AIdan javob

Swift'dagi ma'lumot turlari asosiy ikki xotira hududida saqlanadi: stack va heap.

Stack

  • Qiymat turlari (value types):
    • struct (tuplar)
    • enum (raqamlar)
    • Asosiy turlar, masalan, Int, Double, Bool, String (qisqa satrlar optimizatsiya uchun to'g'ridan-to'g'ri stackda saqlanishi mumkin)
  • Ma'lumotlar to'g'ridan-to'g'ri stackda bajarilayotgan funktsiyalar tartibida saqlanadi.
  • Xotira ajratish va bo'shatish avtomatik va juda tez (LIFO - Last In, First Out).

Heap

  • Reference types (referens turlari):
    • class (sinflar)
    • Funktsiyalar va yopishtirishlar (Closures)
    • Ob'ektlar (AnyObject)
  • Ob'ektlar o'zlari heapda saqlanadi, stackda esa faqat ularga havolalar mavjud.
  • Heapda xotira ajratish va bo'shatish dinamik tarzda amalga oshadi va tizim tomonidan boshqariladi (Automatic Reference Counting - ARC).
  • Heapdagi ma'lumotlarga kirish bilvosita, ko'rsatkich orqali amalga oshiriladi.

Xususiyatlar

  • Qiymat turini tayinlashda, butun qiymat nusxalanadi.
  • Referens turini tayinlashda, faqat havola nusxalanadi, va ikkala ob'ekt ham bir xil xotira hududiga ishora qiladi.
  • ARC, heapdagi ob'ektlarga kuchli havolalar sonini kuzatadi va havolalar qolmay qolganida xotirani avtomatik ravishda bo'shatadi.
// Qiymat turining misoli - stackda saqlanadi
struct Point {
    var x: Int
    var y: Int
}

var p1 = Point(x: 10, y: 20)
var p2 = p1 // Butun qiymat nusxalanadi

p2.x = 30 // p1 o'zgarmaydi
print("p1: \(p1), p2: \(p2)") // Natija: p1: Point(x: 10, y: 20), p2: Point(x: 30, y: 20)

// Referens turining misoli - heapda saqlanadi
class Circle {
    var radius: Double

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

var c1 = Circle(radius: 5.0)
var c2 = c1 // Faqat havola nusxalanadi

c2.radius = 10.0 // c1 ham o'zgaradi, chunki ikkalasi ham bir xil ob'ektga ishora qiladi
print("c1.radius: \(c1.radius), c2.radius: \(c2.radius)") // Natija: c1.radius: 10.0, c2.radius: 10.0