- Published on
Struct vs Class vs Actor va Xotira boshqaruvi
- Authors
- Name
- ShoxruxC
- @iOSdasturchi
Swift tilining eng muhim suhbat (Interview) savollari
Biz tez orada Actor (Aktyor) lar mavzusiga o'tamiz. Lekin Actor nima ekanligini tushunish uchun avvalo Swift tilining eng muhim poydevorlarini: Struct va Class farqlarini, shuningdek, xotirada ular qanday ishlashini to'liq anglab olishimiz shart.
Bu dars juda ko'p nazariy qismlardan iborat bo'lib, har bir qismi Senior darajali iOS dasturchilardan intervyularda eng ko'p so'raladigan savollarga javob beradi.
1. Value Type (Struct) vs Reference Type (Class)
- Struct, Enum, String, Int, Array — bular Value Type (Qiymat turi) hisoblanadi.
- Class, Function, Actor — bular Reference Type (Havola turi) hisoblanadi.
Bu nima degani?
Value Type (Struct): Siz struct obyektini boshqa bir o'zgaruvchiga tenglaganingizda, uning to'liq nusxasi (copy) olinadi.
struct MyStruct {
var title: String
}
var struct1 = MyStruct(title: "Birinchi")
var struct2 = struct1 // To'liq alohida nusxa yaratildi
struct2.title = "Ikkinchi"
print(struct1.title) // Natija: "Birinchi" (O'zgarmadi!)
print(struct2.title) // Natija: "Ikkinchi"
Reference Type (Class): Siz class obyektini boshqa bir o'zgaruvchiga tenglashtirganingizda, yangi nusxa emas, balki xotiradagi o'sha asl obyektga yo'llanma (pointer) beriladi.
class MyClass {
var title: String
init(title: String) { self.title = title }
}
var class1 = MyClass(title: "Birinchi")
var class2 = class1 // Ikkalasi ham bitta obyektni ko'rsatmoqda!
class2.title = "Ikkinchi"
print(class1.title) // Natija: "Ikkinchi" (O'zgarib qoldi!)
print(class2.title) // Natija: "Ikkinchi"
Class larni bir joyda o'zgartirsangiz, u hamma joyda o'zgarib qoladi. Chunki siz qiymatni emas, obyektga bo'lgan havolani ulashasiz.
2. Xotira qanday ishlaydi: Stack vs Heap
Ilovalarimizda xotiraning asosan ikki qismi bo'ladi: Stack va Heap.
- Stack: Juda, juda tez ishlaydigan xotira. Barcha Value Type (Struct) lar aynan Stack xotirasida saqlanadi. iOS tizimida har bir Thread (oqim) o'zining shaxsiy Stack xotirasiga ega. Shuning uchun ham ularga murojaat qilish nihoyatda tez va xavfsiz (Thread-safe) hisoblanadi.
- Heap: Kattaroq, lekin sekinroq ishlaydigan xotira. Barcha Reference Type (Class) lar Heap'da saqlanadi. Ilovadagi hamma Thread'lar uchun faqat bitta umumiy Heap mavjud bo'ladi. Agar ikkita Thread bir vaqtda bitta Heap obyektiga murojaat qilsa nima bo'ladi? Bu sinxronizatsiya va "Data Race" muammolariga (app crash bo'lishiga) olib kelishi mumkin.
Shu sababdan ham, Struct ishlatish Class ishlatishga qaraganda bir necha million marta tezroq va xavfsizroq hisoblanadi.
3. ARC (Automatic Reference Counting)
Heap xotirasi (Classlar saqlanadigan joy) o'z-o'zidan tozalanmaydi. Buni Swift tilida ARC boshqaradi.
- Qachonki siz class ga havola (reference) yaratsangiz, uning ARC sanog'i (count) +1 ga oshadi.
- Qachonki siz o'zgaruvchini yo'q qilsangiz (yoki deinit bo'lsa), ARC sanog'i -1 ga kamayadi.
- Sanog' 0 ga teng bo'lganida, tizim bu obyekt xech kimga kerak emasligini tushunib, uni Heap xotiradan butunlay o'chirib yuboradi.
Muhim qoida: Value Type (Struct) lar uchun ARC ishlamaydi, chunki ular Stack da avtomatik tez tozalanadi.
4. Nega Weak Self kerak? (Strong va Weak)
ARC count oshishi uchun siz odatiy (Strong) havola berishingiz kerak. Agar ikkita class bir-birini xotirada qattiq (Strong) ushlab tursa, ARC soni hech qachon 0 ga tushmaydi. Natijada xotirada "Memory Leak" (xotira sizib chiqishi yoki muzlab qolishi) yuzaga keladi.
Buning oldini olish uchun yordamchi o'zgaruvchilarga weak (kuchsiz) kalit so'zi beriladi. weak orqali ulangan obyetklar ARC sanog'ini oshirmaydi. Masalan, asinxron closure'larda self kuchli ushlab qolinmasligi uchun ko'pincha [weak self] deb yozishimizning asosiy sababi shu.
Xulosa
- Struct — xavfsiz, juda tez, multithreading uchun mukammal va har doim birinchi tanlov bo'lishi kerak.
- Class — meros olish (inheritance) kerak bo'lganda, Objective-C kutubxonalari ishlatilganda yoki bitta yagona obyekt holati dasturning bir nechta joyida sinxron ko'rinishi kerak bo'lganda ishlatiladi.
- Va nihoyat, agar siz Class dan foydalansangiz va u multithreading (parallel ishlash) da xavfsiz bo'lishini xohlasangiz, sizga Actor kerak bo'ladi (bu haqda keyingi darsda).