Azimjon Abdurasulov

Middle (3-5 yil)

Interview Savollari

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 Racening 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! 🚀

Markdown manba

iOS Lessons