# Middle iOS Engineer - Interview Savollari va Javoblari (3-5 yil tajriba)

Ushbu qo'llanmada Middle darajadagi iOS dasturchilar uchun Arxitektura, Multi-threading (oqimlar), Dizayn naqshlari va Swift'ning ilg'or xususiyatlari bo'yicha **50 ta muhim savol va javoblar** jamlangan.

---

## 1. Arxitektura va Dizayn Naqshlari (Design Patterns)

### 1. MVC va MVVM arxitekturalarining asosiy farqi nimada?
**Javob:**
*   **MVC (Model-View-Controller):** Controller ham biznes mantiqni, ham UI yangilanishlarni boshqaradi. Bu ko'pincha "Massive View Controller" muammosini keltirib chiqaradi.
*   **MVVM (Model-View-ViewModel):** Biznes mantiq `ViewModel` ga o'tkaziladi. `View` (yoki Controller) faqat ma'lumotlarni ko'rsatadi. `ViewModel` va `View` o'rtasida bog'liqlik (Data Binding) o'rnatiladi.

### 2. Dependency Injection (DI) nima va u nega zarur?
**Javob:** DI — bu obyekt o'ziga kerakli yordamchi modullarni (masalan, NetworkManager) o'zi yaratmasdan, tashqaridan (odatda `init` orqali) qabul qilishi. Bu modullarni bir-biridan ajratish (decoupling), qayta ishlatish va Unit Test yozishni osonlashtirish uchun kerak.

### 3. Singleton naqshining kamchiliklari nimada?
**Javob:** Singleton butun ilova bo'ylab yagona obyekpni yaratadi. Kamchiliklari:
*   Yashirin qaramliklarni (Hidden dependencies) keltirib chiqaradi.
*   Unit Test yozishni qiyinlashtiradi (State'ni tozalab bo'lmaydi).
*   Threading (oqimlar) bilan ishlashda xavfli bo'lishi mumkin (Race conditions).

### 4. VIPER arxitekturasi qanday qismlardan iborat?
**Javob:**
*   **View:** UI va foydalanuvchi bilan aloqa.
*   **Interactor:** Biznes mantiq (Data manager bilan ishlash).
*   **Presenter:** View uchun ma'lumot tayyorlash va logikani bog'lash.
*   **Entity:** Ma'lumot modellari.
*   **Router:** Ekranlar o'rtasidagi o'tishlar (navigation).

### 5. Coordinator (Router) pattern nima?
**Javob:** View Controller'larni navigatsiya qilish mas'uliyatidan xalos etish uchun ishlatiladigan pattern. Coordinator ekranlar o'rtasidagi mantiqiy o'tishlarni boshqaradi, bu esa VC'larni mustaqil va qayta ishlatiladigan qiladi.

### 6. SOLID: Single Responsibility (Yagona mas'uliyat) prinsipi nima?
**Javob:** Har bir klass yoki modul faqat bitta aniq vazifani bajarishi va o'zgartirish uchun faqat bitta sababga ega bo'lishi kerak. Masalan, rasm yuklovchi klass rasmni saqlash yoki tahrirlash bilan shug'ullanmasligi lozim.

### 7. SOLID: Open/Closed (Ochiq/Yopiq) prinsipi nima?
**Javob:** Klasslar kengaytirish uchun ochiq (extension orqali yangi funksiya qo'shish), lekin mavjud kodni o'zgartirish uchun yopiq bo'lishi kerak. Ya'ni yangi funksionallik eski kodga zarar bermasdan qo'shilishi lozim.

### 8. SOLID: Dependency Inversion (Qaramlikni teskari o'girish) nima?
**Javob:** Yuqori darajadagi modullar quyi darajadagi modullarga bog'lanmasligi kerak. Ikkalasi ham abstraksiyalarga (Protokollarga) bog'lanishi lozim. Bu orqali biz modullarni oson almashtira olamiz (masalan, API o'rniga Mock ma'lumot).

### 9. Protocol-Oriented Programming (POP) nima?
**Javob:** Swift'da inheritance (merosxo'rlik) o'rniga protokollardan foydalanishga asoslangan yondashuv. Protokol extension'lari orqali metodlarga default implementatsiya berish mumkin, bu esa klasslardan tashqari Struct va Enum'lar uchun ham polimorfizm imkonini beradi.

### 10. `some View` (Opaque Types) nima?
**Javob:** SwiftUI'da ishlatiladi. Bu funksiya aynan qaysi turni qaytarishini tashqaridan yashiradi, lekin kompilyatorga aniq bir tur qaytishini kafolatlaydi. Bu unumdorlikni oshiradi va arxitekturani moslashuvchan qiladi.

---

## 2. Threading, GCD va Asinxronlik

### 11. `sync` va `async` farqi hamda Deadlock nima?
**Javob:**
*   `sync`: Topshiriq bitmaguncha joriy oqimni (thread) kutib turadi.
*   `async`: Topshiriqni topshiradi va oqimni bo'shatib beradi, natijani kutmaydi.
*   **Deadlock:** Ikki yoki undan ortiq oqim bir-birini cheksiz kutib qolishi. Masalan, Main oqimda `DispatchQueue.main.sync` chaqirilsa, deadlock yuz beradi.

### 12. DispatchGroup nima uchun kerak?
**Javob:** Bir nechta asinxron topshiriqlarni bitta guruhga yig'ish va ularning barchasi bajarilib bo'lgandan so'ng umumiy xabar (notify) olish uchun ishlatiladi.

### 13. DispatchSemaphore nima?
**Javob:** Bir vaqtning o'zida bir nechta oqimda bajarilayotgan topshiriqlar sonini cheklash (limitlash) mexanizmi. Masalan, bir vaqtda faqat 2 ta rasm yuklanishini ta'minlash.

### 14. Dispatch Barrier nima va u qaysi muammoni hal qiladi?
**Javob:** "Reader-Writer Problem"ni hal qiladi. Ya'ni Concurrent queue ichida ma'lumotlarni o'qishda bir vaqtda ruxsat beradi, lekin yozish (update) paytida barcha oqimlarni to'xtatib, yozishni navbat bilan (serially) amalga oshiradi. Bu `Data Race`ning oldini oladi.

### 15. QoS (Quality of Service) darjalari tushunchasi?
**Javob:** Oqimlarga prioritet berish:
*   `.userInteractive`: UI animatsiyalari (eng yuqori).
*   `.userInitiated`: Foydalanuvchi kutayotgan amallar.
*   `.utility`: Uzoq vaqt oladigan ishlar (yuklash).
*   `.background`: Foydalanuvchi sezmaydigan ishlar (keshni tozalash).

### 16. @escaping vs Non-escaping closures?
**Javob:**
*   **Non-escaping (default):** Closure funksiya ichida bajarilib tugaydi.
*   **@escaping:** Closure funksiya tugaganidan keyin ham xotirada qoladi (masalan, internetdan javob kelguncha kutish uchun).

### 17. Closure ichida `[weak self]` va Capture Lists?
**Javob:** Closure'lar o'z atrofidagi obyektlarni "capture" (ushlab olish) qiladi. Agar Reference cycle hosil bo'lsa, `[weak self]` orqali self'ni optional qilib olish xotira oqishini (memory leak) to'xtatadi.

### 18. Failable Initializer (`init?`) amaliyoti?
**Javob:** Obyekt yaratish shartlari bajarilmasa (masalan, JSON'da ID yo'q bo'lsa), butun obyektni yaratmasdan `nil` qaytarish uchun kerak. Bu crash'larning oldini oladi.

### 19. Autoreleasepool nima va qachon ishlatiladi?
**Javob:** Tsikllar ichida (masalan, `for` loop) juda ko'p obyektlar yaratilsa (ayniqsa UIImage), xotira tozalanishini kutib turmasdan darhol tozalash uchun ishlatiladi. Bu OOM (Out of Memory) crash'idan asraydi.

### 20. `lazy` o'zgaruvchilar unumdorligi?
**Javob:** Lazy o'zgaruvchilar faqat birinchi marta chaqirilganda hisoblanadi. Bu og'ir hisob-kitoblarni faqat kerak bo'lganda bajarish orqali ilova ishga tushishini (launch time) tezlashtiradi.

---

## 3. Swift Logikasi va Reaktiv Dasturlash

### 21. `@StateObject` va `@ObservedObject` farqi?
**Javob:**
*   `@StateObject`: View bir necha bor render bo'lsa ham, obyektni xotirada saqlab qoladi (Owner).
*   `@ObservedObject`: View qayta render bo'lganda obyekt ham yangidan yaratilishi mumkin (Dependency).

### 22. Swift'da `defer` amaliyoti?
**Javob:** Funksiya ichidan qanday chiqib ketmasin (error yoki return), ma'lum bir kodni (masalan, bazani yopish) albatta bajarilishini kafolatlaydi.

### 23. Swift Combine asoslari (Publisher/Subscriber)?
**Javob:** Combine — bu asinxron hodisalarni boshqarish framework'i. `Publisher` ma'lumotlarni yuboradi, `Subscriber` esa ularni qabul qilib, UI'ni yangilaydi.

### 24. PassthroughSubject vs CurrentValueSubject?
**Javob:**
*   `CurrentValueSubject`: Eng oxirgi qiymatni o'zida saqlaydi va yangi obunachiga darhol uzatadi.
*   `PassthroughSubject`: Qiymatni saqlamaydi, faqat yangi kelgan xabarlarni tarqatadi.

### 25. UserDefaults va Keychain xavfsizligi?
**Javob:** UserDefaults — ochiq text fayl, xavfsiz emas. Keychain — Apple apparat darajasida shifrlaydigan xavfsiz joy. Parol va tokenlar faqat Keychain'da saqlanishi shart.

### 26. `mutating` metodlar arxitekturasi?
**Javob:** Struct'lar value type bo'lgani uchun ularni o'zgartirish "yangi nusxa yaratish" orqali amalga oshadi. `mutating` kalit so'zi kompilyatorga bu jarayonni boshqarish haqida signal beradi.

### 27. Result Type nima?
**Javob:** `Result<Success, Failure>` enumi orqali asinxron metodlarda yo muvaffaqiyat (ma'lumot), yo xatolik (Error) qaytarishni qat'iy va tushunarli qilish uchun ishlatiladi.

### 28. Opaque vs Existential types farqi?
**Javob:** `some` (Opaque) va `any` (Existential). `some` kompilyatsiya paytida tur aniq bo'lishini bildiradi (Static Dispatch), `any` esa runtime'da tur o'zgarishi mumkinligini aytadi (Dynamic Dispatch - biroz sekinroq).

### 29. Auto Layout: Hugging Priority nima?
**Javob:** Agar StackView yoki boshqa joyda bo'sh joy qolsa, qaysi element o'z hajmidan ko'ra tortilib semirib ketmasligini hal qiladi. Priority yuqori bo'lsa, element o'z o'lchamini mahkam ushlaydi.

### 30. Auto Layout: Compression Resistance?
**Javob:** Agar joy yetishmasa, qaysi element siqilib, ichidagi yozuvi (text) kesilib ketmasligini hal qiladi. Priority yuqori bo'lsa, element siqilishga qarshilik ko'rsatadi.

---

## 4. Tarmoq (Networking) va Ma'lumotlar Bazas

### 31. Reusable Cells (UITableView) ishlash mexanizmi?
**Javob:** Memory crash'ni oldini olish uchun 10 000 ta qator uchun 10 000 ta view yaratilmaydi. Faqat ekranda ko'rinadigan 10-12 tasi yaratiladi va scroll bo'lganda ular qayta ishlatiladi (Dequeuing).

### 32. UICollectionViewCompositionalLayout nima?
**Javob:** iOS 13 dan boshlab Apple tomonidan taqdim etilgan murakkab grid-maketlar (layout) chizish uchun deklarativ va moslashuvchan yechim.

### 33. URLSession Data Task asosi?
**Javob:** HTTP so'rovlarini asinxron fonda (background) bajarish uchun ishlatiladi. Natija JSONDecoder orqali modelga o'giriladi va albatta `DispatchQueue.main` orqali UI yangilanadi.

### 34. Codable (Encodable & Decodable) farqi?
**Javob:** `Decodable` — JSON'dan Struct'ga o'tkazish. `Encodable` — Struct'dan JSON'ga o'tkazish. `Codable` ikkala protokolning jamlanmasidir.

### 35. CoreData vs Realm taqqoslash?
**Javob:** CoreData — Apple'ning native yechimi (murakkabroq, tushunarsizroq). Realm — uchinchi tomon yechimi (tezroq, osonroq va thread-safe ishlashi oson).

### 36. Unit Testing: Nega u kerak?
**Javob:** Kod logikasi (biznes mantiq) to'g'ri ishlashini avtomatik tekshirish uchun. Bu yangi kod qo'shilganda eski funksiyalar buzilmaganligiga kafolat beradi (Regression testing).

### 37. XCTestda Mocking va Stubbing nima?
**Javob:**
*   **Mock:** Obyektning metodlari chaqirilganligini tekshirish uchun soxta obyekt.
*   **Stub:** Test uchun belgilangan tayyor ma'lumotni qaytaruvchi soxta javob.

### 38. Array va Set qidiruv tezligi (Big O notation)?
**Javob:** Arrayda qidirish O(n) vaqt oladi (hamma elementni ko'rib chiqadi). Setda qidirish O(1) vaqt oladi (hash value orqali darhol topadi).

### 39. Dictionary Tizimi qanday ishlaydi?
**Javob:** Dictionary "Hash Map" asosida ishlaydi. Kalit (Key) `Hashable` bo'lgani uchun, qiymatni topish o'ta tez — O(1) bo'ladi.

### 40. Type Casting: `as?` va `as!` farqi?
**Javob:** `as?` — xavfsiz, o'xshamasa nil qaytaradi. `as!` — majburiy, o'xshamasa ilova crash bo'ladi. Har doim `as?` ishlatish tavsiya etiladi.

---

## 5. Loyihani Boshqarish va Tools

### 41. Property Observers (`willSet`, `didSet`) nima?
**Javob:** O'zgaruvchi qiymati o'zgarishidan oldin (`willSet`) va o'zgargandan so'ng (`didSet`) qandaydir kodni bajarish mexanizmi.

### 42. `inout` parametrlari nima uchun?
**Javob:** Funksiya ichiga uzatilgan obyektni tahrirlash va bu tahrir tashqari (original) o'zgaruvchiga ham ta'sir qilishi uchun ishlatiladi.

### 43. Clean Architecture (Tabaqalar) mantiqi?
**Javob:** Loyihani bir-biriga bog'liq bo'lmagan qatlamlarga bo'lish (Presentation, Domain, Data). Maqsad — tizimni testlash va kengaytirishni osonlashtirish.

### 44. Async/await nima kuchi bilan Combine'dan farq qiladi?
**Javob:** Async/await kodni an'anaviy "linear" ko'rinishda yozish imkonini beradi (Pyramid of doom dan qutqaradi). Combine esa oqimli (stream) ma'lumotlar bilan ishlashda kuchliroq.

### 45. `guard` kalit so'zi afzalligi?
**Javob:** Shart bajarilmaganda funksiyadan erta chiqish (early exit) va koddagi chigallikni (nested if) kamaytirish uchun xizmat qiladi.

### 46. Designated vs Convenience init farqi?
**Javob:** Designated init barcha parametrlarni to'ldiradi. Convenience init esa designated init'ni chaqiradi va ba'zi default qiymatlar bilan ishni osonlashtiradi.

### 47. Tuist yoki Bazel nima uchun kerak?
**Javob:** Katta loyihalarda `.xcodeproj` faylidagi konfliktlarni yo'qotish va build vaqtini optimallashtirish uchun loyihani generatsiya qiluvchi asboblar.

### 48. Cache strategiyalari (RAM vs Disk)?
**Javob:** Tezkor ma'lumotlar uchun `NSCache` (RAM), uzoq muddatli ma'lumotlar uchun `FileManager` (Disk) ishlatiladi. Maqsad — trafikni tejash va offline rejimda ishlash.

### 49. SwiftLint nima?
**Javob:** Jamoada kodni yagona standartda yozishni (stilni) majburlovchi asbob xisoblanadi.

### 50. Git Workflow (Branching strategy)?
**Javob:** Loyiha boshqaruvida GitFlow (main, develop, feature branchlar) yoki Trunk-based (tez-tez main branchga commit qilish) uslublaridan foydalanish bo'yicha tushunchalar.

---

## 6. SwiftUI, Async/Await va Amaliy Chuqur Savollar

### 51. `@EnvironmentObject` nima va qachon ishlatiladi?
**Javob:** Butun View hierarchy (ierarxiya) bo'ylab ma'lumotni uzatish uchun. `@EnvironmentObject` orqali ota view'da inject qilingan `ObservableObject` ni istalgan ichki (nested) view'da olish mumkin — props drilling (har qadamda uzatish) shart emas.

### 52. `NavigationStack` (iOS 16+) va `NavigationView` farqi?
**Javob:** `NavigationStack` yangi tizim bo'lib, programmatik navigatsiyani (path orqali) qo'llab-quvvatlaydi. `NavigationView` eski usul bo'lib, iOS 16 dan boshlab deprecated (eskirgan) deb belgilangan.

### 53. Async/Await nima va Completion Handler'dan afzalligi?
**Javob:** Swift 5.5 da kiritilgan. Asinxron kodni sinxron ko'rinishda yozish imkonini beradi. Completion handler'dardagi "Pyramid of Doom" (ichma-ich qavslar) muammosini to'liq hal qiladi. Xatolarni `try/catch` bilan boshqarish osonlashadi.

### 54. `Task` va `TaskGroup` nima?
**Javob:**
*   `Task`: SwiftUI yoki UIKit ichida asinxron ishni boshlash uchun (`Task { await fetchData() }`).
*   `TaskGroup`: Bir nechta parallel asinxron topshiriqlarni guruhlash va barchasining natijasini kutish uchun.

### 55. `Actor` nima va u qanday muammoni hal qiladi?
**Javob:** Actor — bu reference type bo'lib, o'z ichidagi ma'lumotlarga bir vaqtda faqat bitta thread kirishi mumkinligini ta'minlaydi. Bu "Data Race" muammosini hal qiladi. Uning ichidagi metodlar va property'larga tashqaridan faqat `await` orqali murojaat qilish mumkin.

### 56. Push Notifications (APNs) qanday ishlaydi?
**Javob:**
1.  Ilova APNs (Apple Push Notification service) serveridan device token oladi.
2.  Token backend serverga yuboriladi.
3.  Backend APNs'ga token va xabarni jo'natadi.
4.  APNs qurilmaga push notification yetkazadi.

### 57. `@AppStorage` nima?
**Javob:** SwiftUI'da `UserDefaults` bilan ishlashning qisqa va qulay usuli. `@AppStorage("key") var isDarkMode = false` deb yozilsa, bu qiymat UserDefaults'ga avtomatik saqlanadi va o'zgarganda UI yangilanadi.

### 58. Instruments yordamida Memory Leak topish?
**Javob:** Xcode → Product → Profile → Leaks instrumentini tanlash. Ilova ishlayotganda "binafsha rangli" belgilar paydo bo'lsa — bu xotira oqishi. "Memory Graph Debugger" orqali qaysi obyektlar o'chirilmayotganini aniqlash mumkin.

### 59. `@MainActor` nima?
**Javob:** Swift Concurrency'da funksiya yoki class'ni faqat Main Thread'da ishlashini kafolatlovchi attribute. UI yangilash kodlariga `@MainActor` qo'yish xavfsiz ishlash uchun muhim.

### 60. Core Location — foydalanuvchi joylashuvini olish?
**Javob:** `CLLocationManager` orqali foydalanuvchi joylashuvini so'rash. Info.plist'ga `NSLocationWhenInUseUsageDescription` qo'shish shart. Delegate orqali koordinatalar (latitude, longitude) olinadi.

### 61. `@ViewBuilder` nima?
**Javob:** SwiftUI'da bir nechta View'ni bitta blok ichida qaytarish imkonini beruvchi result builder. Custom view'lar yaratishda bola (child) elementlarni qabul qilish uchun ishlatiladi.

### 62. `Identifiable` protokoli?
**Javob:** SwiftUI'da `List` va `ForEach` ichida har bir elementni unikal aniqlash uchun kerak. Struct'ga `id` property'si qo'shilishi shart. Bu SwiftUI'ga qaysi element o'zgarganini to'g'ri bilish imkonini beradi.

### 63. `GeometryReader` nima?
**Javob:** View'ning o'lchami va joylashuvini aniqlash uchun konteyner. Bu orqali View'ning kengligiga nisbatan foiz (percentage) asosida layout qilish mumkin.

### 64. `Timer` va `Combine` orqali davomiy yangilanish?
**Javob:** `Timer.publish(every: 1.0, on: .main, in: .common).autoconnect()` orqali har sekundda UI'ni yangilash. Bu stopwatch, countdown yoki real-time ma'lumotlar ko'rsatishda ishlatiladi.

### 65. KVO (Key-Value Observing) nima?
**Javob:** Objective-C dan meros qolgan pattern. Biror obyektning xususiyati (property) o'zgarganda avtomatik xabar olish mexanizmi. Swift'da `@objc dynamic` bilan birgalikda yoki Combine'dagi `publisher(for:)` orqali ishlatiladi.

---
### Yakuniy Maslahat:
Middle darajasida sizdan nafaqat "qanday ishlashi", balki "nega aynan shu usul tanlanganligi" haqida ko'proq so'rashadi. Async/Await va SwiftUI bo'yicha amaliy loyiha ko'rsata olsangiz — bu katta afzallik! Muvaffaqiyat tilaymiz! 🚀
