UIKit 9: UIKit va SwiftUI Chuqur Suhbat Savollari — 40+ Professional Savol va Javoblar
📱 UIKit va SwiftUI — chuqur
UIKit 9: UIKit va SwiftUI Chuqur Suhbat Savollari — 40+ Professional Savol va Javoblar
Ushbu darsda Middle, Senior va Lead darajadagi iOS dasturchilar texnik intervyusida (Technical Interview) so'raladigan 40 dan ortiq eng chuqur va dolzarb savollar hamda ularning aniq, o'lchangan faktlarga asoslangan javoblari jamlangan. Har bir mavzu bo'yicha batafsil bilim olish uchun tegishli darslarga to'g'ridan-to'g'ri havolalar berilgan.
1. UIView, CALayer va Koordinatalar Tizimi
1. UIView va CALayer o'rtasidagi asosiy farq nima va nega Apple ularni ikkiga ajratgan?
Javob: UIView — bu interaktivlik, foydalanuvchi teginishlari (touch handling), Accessibility va avtomatik joylashuv (Auto Layout) bilan ishlovchi boshqaruvchi qobiqdir. U UIResponder sinfidan meros oladi. CALayer esa Core Animation qatlamida turadi va bevosita GPU orqali piksellarni ekranga chizish (rendering) uchun javobgardir. Layer teginishlarni (touch events) qabul qilmaydi. Apple ularni ajratganining sababi — kodni qayta ishlatish va javobgarlikni ajratishdir: macOS (NSView) va iOS (UIView) butunlay boshqacha interaktivlikka ega (sichqoncha kursoriga nisbatan barmoq teginishi), biroq ularning ikkalasi ham GPU chizish uchun bir xil CALayer texnologiyasidan foydalanadi.
2. frame va bounds o'rtasidagi farq nima? Ob'ekt 45 gradusga aylantirilganda (rotation) ulardan qaysi biri o'zgaradi?
Javob:
frame— ota view (superview) koordinatalar tizimidagi joylashuv (origin) va o'lcham (size). U view'ning butun tashqi chegarasini o'z ichiga oluvchi to'g'ri to'rtburchakdir (bounding box).bounds— view'ning o'z ichki koordinatalar tizimidagi joylashuvi va o'lchami.
Agar view'ga 45 graduslik transform berilsa, uning bounds.size o'zgarmasdan qoladi, lekin frame.size aylanma figurani to'liq sig'dirish uchun sezilarli darajada kattalashadi.
3. Agar view.bounds.origin qiymatini (x: 50, y: 50) ga o'zgartirsak, uning subview'lari qayerga qarab siljiydi?
Javob: Uning subview'lari ekranda chapga va yuqoriga (manfiy yo'nalishda 50 pikselga) siljiydi. Chunki bounds.origin — bu view o'zining ichki koordinata qog'ozining qaysi nuqtasini ko'rsatish oynasi (viewport) sifatida qarayotganini bildiradi. Oynani (50, 50) nuqtaga surish kontentni teskari tomonga suradi. UIScrollView aynan mana shu mexanizm asosida ishlaydi (contentOffset aslida bounds.origin ustiga qurilgan).
4. hitTest(_:with:) algoritmi qanday ishlaydi va qaysi holatlarda view teginishni qabul qilmaydi?
Javob: hitTest eng chuqur subview'dan boshlab "teskari ierarxiya" (reverse depth-first traversal) bo'yicha teginish nuqtasini qidiradi. View quyidagi 4 holatda zudlik bilan nil qaytaradi va o'z subview'larini ham tekshirmaydi:
isUserInteractionEnabled == falseisHidden == truealpha < 0.01point(inside:with:) == false(ya'ni teginish nuqtasi view chegarasidan tashqarida).- Batafsil: UIKit 1 — View Ierarxiyasi va Koordinatalar Tizimi
5. Subview ota view chegarasidan (bounds) tashqariga chiqib tursa (clipsToBounds == false), unga teginish bosiladimi?
Javob: Yo'q, bosilmaydi! Sababi, hitTest algoritmi avval ota view'ning point(inside:with:) metodini tekshiradi. Agar nuqta ota view chegarasidan tashqarida bo'lsa, ota view darhol nil qaytaradi va subview ko'rinib turgan bo'lsa ham, unga teginish hodisasi yetib bormaydi. Buni to'g'rilash uchun ota view'ning point(inside:with:) metodini override qilib, teginish doirasini kengaytirish kerak.
6. Responder Chain nima va teginish hodisasi qanday marshrut bo'yicha uzatiladi?
Javob: Responder Chain — bu UIResponder ob'ektlari ierarxiyasi bo'lib, voqealarni (touch, motion, remote-control) qayta ishlovchi topilguniga qadar zanjir bo'ylab yuqoriga uzatadi: First Responder (eng chuqur UIView) -> superview -> ... -> UIViewController -> UIWindow -> UIWindowScene -> UIApplication -> UIApplicationDelegate. Agar hech kim hodisani qabul qilmasa, u e'tiborsiz tashlab yuboriladi.
2. Layout, Rendering va Auto Layout
7. RunLoop va Layout Cycle o'rtasidagi bog'liqlik qanday? Update coalescing nima?
Javob: RunLoop foydalanuvchi teginishlari, tarmoq javoblari va taymerlarni ishlab bo'lgach, har bir aylanish oxirida Display Pass (chizish bosqichi)ni amalga oshiradi. Agar bitta tsikl davomida setNeedsLayout() 100 marta chaqirilsa ham, tizim darhol 100 marta qayta hisoblamaydi. U barchasini bitta bayroqcha bilan belgilaydi va navbatdagi Display Pass vaqtida layoutSubviews()ni faqat bir marta chaqiradi. Bu mexanizm Update Coalescing (yangilanishlarni birlashtirish) deyiladi.
8. setNeedsLayout() va layoutIfNeeded() farqi nima?
Javob:
setNeedsLayout()— asinxron bo'lib, view'ni "qayta hisoblash kerak" deb belgilab qo'yadi. Qayta hisoblash navbatdagi RunLoop aylanishida sodir bo'ladi.layoutIfNeeded()— sinxron (darhol) chaqiruvdir. Agar view "ifloslangan" (ya'nisetNeedsLayoutchaqirilgan) bo'lsa, u kutib o'tirmasdan shu zahotiyoqlayoutSubviews()ni ishga tushiradi. Animatsiyalar (masalan, constraint o'zgarishini animatsiya qilish) aynanlayoutIfNeededyordamida amalga oshiriladi.- Batafsil: UIKit 2 — Layout va Render Sikli
9. iOS 26 da taqdim etilgan yangi updateProperties() metodi nima va u qachon ishlaydi?
Javob: updateProperties() — iOS 26 da UIView va UIViewControllerga qo'shilgan yangi metod bo'lib, u bevosita layoutSubviews() chaqirilishidan sal oldin ishlaydi. Uning asosiy xususiyati — u layout tizimidan mustaqil ishlaydi. Ya'ni elementlarning vizual xususiyatlarini (ranglar, shaffoflik, matnlar) yangilash uchun butun Auto Layout dvigatelini qayta ishga tushirish talab etilmaydi.
10. Auto Layout tizimidagi Content Hugging va Compression Resistance farqi nimada?
Javob:
- Content Hugging Priority (CHP): "Meni o'z o'lchamimdan kattalashtirib yuborma!" (Antistretching). Prioritet qanchalik yuqori bo'lsa, element o'zining tabiiy
intrinsicContentSizeidan tashqariga shunchalik kamroq cho'ziladi. - Content Compression Resistance Priority (CCRP): "Meni o'z o'lchamimdan kichik qilib siqib qo'yma!" (Antishrinking). Prioritet qanchalik yuqori bo'lsa, element o'z kontentini qisqartirib yuborishdan shunchalik qattiq himoyalanadi.
- Batafsil: UIKit 2 — Layout va Render Sikli
11. ProMotion (120Hz) displeylarida animatsiya silliqligini ta'minlash uchun qaysi vositadan foydalaniladi?
Javob: CADisplayLink vositasi orqali. iOS 15 dan boshlab preferredFrameRateRange (masalan, min: 60, preferred: 120, max: 120) orqali kadrlar tezligini dinamik sozlash mumkin. iPhone'da 120Hz to'liq ishlashi uchun Info.plist da CADisableMinimumFrameDurationOnPhone kaliti true qilib ko'rsatilishi shart (iPad Pro'da bu talab qilinmaydi).
3. UIViewController va Arxitektura
12. viewIsAppearing(_:) metodi qachon chaqiriladi va nega viewWillAppear o'rniga tavsiya etiladi? Qaysi tizimga backdeploy qilingan?
Javob: viewIsAppearing(_:) — viewWillAppeardan keyin, lekin viewDidAppeardan oldin chaqiriladi. Eng muhim jihati: u chaqirilgan vaqtda view ierarxiyasi oynaga (window) allaqachon qo'shilgan bo'ladi va uning aniq o'lchamlari va trait parametrlari to'liq ma'lum bo'ladi. viewWillAppearda esa view o'lchamlari hali ota oyna darajasida hisoblab chiqilmagan bo'ladi. Apple bu metodni iOS 13.0+ (va iPadOS 13, tvOS 13) gacha backdeploy qilgan.
13. Container View Controller yaratishda qaysi 4 ta metod chaqirilishi shart?
Javob:
addChild(childVC)— ota-bola munosabatini o'rnatadi;view.addSubview(childVC.view)— ko'rinish ierarxiyasiga qo'shadi;childVC.view.frame = ...yoki Auto Layout constraint'larni ulash;childVC.didMove(toParent: self)— bolaga ko'chish yakunlanganini xabar qiladi.
O'chirishda esa teskari tartibda: willMove(toParent: nil), removeFromSuperview(), removeFromParent().
14. iOS 27 da UIScreen.main nega taqiqlangan va uning o'rniga nima ishlatiladi?
Javob: Zamonaviy iOS'da bitta ilova ko'p oynali rejimda (Multi-window, iPad Stage Manager, Mac Mirroring yoki tashqi monitor ulanishi) ishlashi mumkin. UIScreen.main har doim asosiy jismoniy ekranni qaytaradi, bu esa tashqi displeyga ulanganda xato o'lchamlarga olib keladi. iOS 27 da UIScreen.main rasman eskirgan bo'lib, o'rniga quyidagilar ishlatiladi: view.window?.windowScene?.screen yoki trait collection orqali traitCollection.displayScale.
15. iOS 27 da UIScene lifecycle majburiyligi nimani anglatadi?
Javob: WWDC26 #278 da Apple qat'iy e'lon qildi: yangi SDK'lar bilan kompilyatsiya qilinganda UIScene ierarxiyasi (SceneDelegate) bo'lmagan, faqat eski AppDelegate.windowga tayanuvchi ilovalar umuman ishga tushmaydi (will no longer launch).
4. Xotira Boshqaruvi va ARC (Memory Deep)
16. ARC da weak va unowned o'rtasidagi texnik farq nima?
Javob:
weak— xotiradagi ob'ektga zaif havola. Ob'ekt deallocate bo'lganda, runtime uning ko'rsatkichini avtomatik ravishdanilga aylantiradi (zeroing weak reference). Shuning uchunweakhar doim Optional bo'ladi (var x: Object?).unowned— ob'ektga zaif bo'lmagan, lekin hisoblagichni oshirmaydigan havola. Ob'ekt o'chganda ko'rsatkichnilga aylanmaydi. Agar o'chgan ob'ektga murojaat qilinsa, Swift runtime qat'iy xatolik berib qulaydi (Fatal error: Attempted to read an unowned reference...).- Batafsil: UIKit 4 — Xotira va ARC
17. NotificationCenter'da qachon removeObserver chaqirish shart va qachon shart emas?
Javob:
- **Target/Selector (
addObserver(_:selector:...)):** iOS 9.0+ dan boshlab tizimdeinitpaytida avtomatik tarzda tozalaydi, qo'ldaremoveObserveryozish shart emas. - **Block-based (
addObserver(forName:...)): Ob'ekt deallocate bo'lishidan oldin albatta** qaytarilganNSObjectProtocoltokeniniNotificationCenter.default.removeObserver(token)orqali o'chirish shart! Aks holda xotira sizishi (memory leak) ro'y beradi. - Batafsil: UIKit 4 — Xotira va ARC
18. didReceiveMemoryWarning() metodi iOS'da deprecated bo'lganmi?
Javob: Yo'q, deprecated EMAS! Bu keng tarqalgan mifik xato da'vodir. Ushbu metod iOS 2.0 dan buyon mavjud va hozirgi iOS 26/27 da ham to'liq faol. Tizim xotira yetishmovchiligiga duch kelganda har bir faol View Controller'ga ogohlantirish yuborishda davom etadi.
19. os_proc_available_memory() nima va undan qanday foydalaniladi?
Javob: extern size_t os_proc_available_memory(); (iOS 13.0+) — joriy ilovaga tizim tomonidan ajratilishi mumkin bo'lgan qolgan taxminiy baytlar miqdorini qaytaruvchi C funksiyasi. Apple rasmiy hujjatida ta'kidlanganidek, bu raqam maslahat xarakteriga ega (advisory only), uni keshlash mumkin emas va butun xotirani to'ldirish maqsadida foydalanmaslik kerak.
20. Copy-on-Write (CoW) nima va isKnownUniquelyReferenced qanday ishlaydi?
Javob: CoW — Swift'dagi qiymat turlarining (Array, Dictionary, String) xotira samaradorligi mexanizmi. Bir massiv ikkinchisiga o'zlashtirilganda, ma'lumotlar darhol nusxalanmaydi, ikkala o'zgaruvchi ham bitta xotira buferiga ko'rsatib turadi. Faqat nusxalardan biri o'zgartirilganda (mutating amalida), unga alohida xotira ajratiladi. Swift ichida bu isKnownUniquelyReferenced(&ref) orqali tekshiriladi: agar havola yagona bo'lsa, xotira ajratilmasdan joyida o'zgartiriladi.
21. autoreleasepool qanday hollarda ishlatilishi shart?
Javob: Katta hajmdagi sikllarda (masalan, 10,000 ta tasvirni qayta ishlash yoki fayllarni o'qishda). RunLoop tsikli tugamaguniga qadar autoreleased ob'ektlar xotiradan bo'shatilmaydi va bu xotira portlashiga (OOM crash) sabab bo'ladi. autoreleasepool { ... } har bir sikl qadamida o'tkinchi xotirani shu zahoti tozalab turadi.
5. Apple Hardware va Qurilmalar
22. scale va nativeScale o'rtasidagi farq nima? Qaysi iPhone'larda ular farq qiladi?
Javob:
scale— mantiqiy nuqtalar (points) va chizilgan render piksellari o'rtasidagi nisbat (odatda 2.0x yoki 3.0x).nativeScale— qurilmaning haqiqiy jismoniy ekran matritsasiga to'g'ri keluvchi piksellar nisbati.
Klassik misol: iPhone 6+/7+/8+ da dastur 3.0x (1242×2208) bo'yicha render qilinib, keyin ekran apparati tomonidan jismoniy 1080×1920 ga tushirilgan (downsampling), bunda scale = 3.0, nativeScale ≈ 2.608 bo'lgan. Zamonaviy OLED iPhone'larda esa ular deyarli har doim bir xil (3.0).
23. ProcessInfo.ThermalState qanday holatlarni o'z ichiga oladi va dasturchi unga qanday munosabat bildirishi kerak?
Javob: To'rtta holat: .nominal, .fair, .serious, .critical. .serious va .critical holatlarida ilova render kadrlar chastotasini (FPS) 60 yoki 30 ga tushirishi, fon yuklamalarini to'xtatishi va murakkab hisob-kitoblarni bekor qilishi lozim, aks holda OS ilovani majburan yopadi.
24. Apple Intelligence funksiyalarini ishlatish uchun minimal apparat talablari qanday?
Javob:
- iPhone: iPhone 15 Pro / iPhone 15 Pro Max (A17 Pro chipi) va undan keyingi modellar (iPhone 16, 17, 18 seriyalari).
- iPad / Mac: Apple Silicon M1 va undan yangi chiplar.
- Xotira: Ba'zi murakkab lokal AI modellar minimal 12GB birlashgan xotira (unified memory) talab qiladi.
- Batafsil: UIKit 5 — Apple Qurilmalari Dasturchilar Uchun
25. iOS 26 dan iOS 27 ga o'tishda qaysi iPad qurilmalari yangilanishdan mahrum bo'ldi?
Javob: Rasmiy xavfsizlik va reliz hujjatlariga ko'ra, aniq 5 ta iPad modeli tizimdan tushib qoldi:
- iPad Pro 12.9 dyuym (3-avlod)
- iPad Pro 11 dyuym (1-avlod)
- iPad Air (3-avlod)
- iPad (8-avlod)
- iPad mini (5-avlod).
(iPhone modellari uchun chegara o'zgarmadi: iPhone 11 va undan yangilari qo'llab-quvvatlanadi).
6. iOS 26 va iOS 27 Yangiliklari
26. iOS 26 ning "Liquid Glass" dizayn tili UIKit'da qaysi API orqali taqdim etilgan?
Javob: UIGlassEffect sinfi orqali:
import UIKit
@available(iOS 26.0, *)
@MainActor
public func configureGlassView() -> UIView {
let glass = UIGlassEffect(style: .regular)
let effectView = UIVisualEffectView(effect: glass)
return effectView
}
Tugmalar uchun esa tayyor konfiguratsiya mavjud: UIButton.Configuration.glass(). Ushbu API iOS, iPadOS, macOS va tvOS'da mavjud (lekin watchOS va visionOS'da yo'q).
27. iOS 27 da SwiftUI @State xususiyati qanday fundamental o'zgarishga uchradi?
Javob: iOS 27 da @State property wrapper mexanizmidan Swift Syntax Macro asosidagi zamonaviy tizimga aylantirildi. Bu orqali xotira ajratilishi tejaladi va View strukturasining ichki hajmi (layout size) sezilarli darajada kichrayadi.
28. iOS 27 da NavigationBar minimallashtirish qanday boshqariladi?
Javob: navigationItem.navigationBarMinimization xususiyati orqali. Dasturchi foydalanuvchi pastga aylantirganda sarlavha va qidiruv panelining qanday qisqarishini (minimization behavior) va uning safe area'ga ta'sirini nozik boshqara oladi.
7. SwiftUI Chuqur va Interop
29. SwiftUI da "View Identity" turlari qaysilar va ularning farqi nima?
Javob:
- Explicit Identity (Aniq identifikatsiya): Ob'ektga
.id("noyob_kalit")orqali yokiIdentifiableprotokoli yordamida berilgan identifikator. - Structural Identity (Strukturaviy identifikatsiya): View'ning ko'rinishlar daraxtidagi joylashuv o'rni. Agar
if/elseshoxlanishi ishlatilsa, SwiftUI ikkita butunlay boshqa ko'rinish deb qaraydi va holatni (State) nollaydi. - Batafsil: SwiftUI Chuqur: Arxitektura va Samaradorlik
30. @Observable (iOS 17+) eski ObservableObjectdan nima bilan farq qiladi?
Javob: ObservableObjectda bitta @Published maydon o'zgarsa ham, butun view to'liq qayta hisoblanadi. @Observable makrosi esa Property-level tracking (maydon darajasidagi kuzatuv) olib boradi. Agar View faqat user.nameni o'qiyotgan bo'lsa, user.age o'zgarganda ushbu View qayta chizilmaydi!
31. _printChanges() nima va u qanday ishlatiladi?
Javob: Self._printChanges() — SwiftUI body ichida chaqiriladigan yashirin nosozliklarni aniqlash (debugging) metodidir. U konsolda ko'rinish qaysi @State yoki @Binding o'zgarishi tufayli qayta hisoblanayotganini aniq ko'rsatib beradi: UserProfileView: _name changed.
32. UIKit ro'yxat katakchasida SwiftUI ko'rinishini eng toza integratsiya qilish usuli nima?
Javob: iOS 16 da taqdim etilgan **UIHostingConfiguration** orqali:
import SwiftUI
import UIKit
@MainActor
public func configureCell(cell: UITableViewCell) {
cell.contentConfiguration = UIHostingConfiguration {
Text("SwiftUI View in UITableViewCell")
}
}
Bu eski UIHostingControllerni subview qilib qo'shish usulidan ancha tezroq va xotira tejamkor hisoblanadi.
8. Real Nosozliklar, Crashlar va Concurrency Yechimlari
33. Swift 6 da error: main actor-isolated property can not be mutated from a nonisolated context xatosi qanday tuzatiladi?
Javob: Task.detached yoki fon oqimidan turib @MainActor mulkini o'zgartirish o'rniga, await MainActor.run { ... } orqali bosh aktyorga o'tish yoki strukturaviy Task { @MainActor in ... } ishlatiladi.
34. Swift 6 dagi [#SendingRisksDataRace] xatosi nimani anglatadi?
Javob: Thread-safe bo'lmagan (non-Sendable) mos yozuvlar sinfi ob'ekti bir oqimdan ikkinchi oqimga uzatilayotganini bildiradi. Yechim: sinf o'rniga struct (Sendable) ishlatish yoki sinfni actor ga aylantirish.
35. Fatal error: Attempted to read an unowned reference but object was already destroyed sababi nima?
Javob: unowned ko'rsatkich bilan bog'langan ob'ekt xotiradan o'chib ketgan, biroq uning maydoniga murojaat qilingan. Ob'ektlarning hayot davri mutlaq bir vaqtda tugashiga to'liq kafolat bo'lmasa, har doim weak ishlatish shart.
36. Auto Layout'da constraint ziddiyatlari ro'yxatida 0x60000... o'rniga tushunarli matn chiqishi uchun nima qilish kerak?
Javob: Constraint yaratilayotganda unga identifier berish kerak: constraint.identifier = "Header_Height_50". Shunda xatolik jurnali qaysi cheklov ziddiyatga sabab bo'lganini yaqqol ko'rsatadi.
37. Klaviaturani ekran pastidagi elementlarga to'qnashmasligi uchun iOS 15+ da qaysi standart qo'llanma tavsiya etiladi?
Javob: view.keyboardLayoutGuide. Elementning pastki chegarasini view.keyboardLayoutGuide.topAnchorga bog'lash kifoya, notification'lar tinglash shart emas.
38. prepareForReuse() da asinxron yuklashlarni bekor qilish (cancel()) nega majburiy?
Javob: Aks holda foydalanuvchi ro'yxatni tez varaqlaganda, oldingi satr uchun yuklangan rasm yangi kelgan boshqa katakchaga chizilib qoladi (data leak / inconsistent state).
39. Main Thread Checker xatosi qachon yuz beradi?
Javob: UIKit elementlarining vizual xususiyatlari (matn, rang, frame, setNeedsLayout) fon oqimidan (background GCD queue yoki detached task) turib chaqirilganda.
40. Swift 6.2 da xotira sarfini kamaytirish uchun qanday yangi turlar taqdim etildi?
Javob: WWDC25 #312 da taqdim etilgan xavfsiz va to'g'ridan-to'g'ri xotiraga murojaat qiluvchi Span turlari (Span, RawSpan, OutputSpan) hamda yig'indisi stekda saqlanuvchi InlineArray. Ular ortiqcha nusxalashlarsiz yuqori unumdorlikni beradi.
Suhbatdan Muvaffaqiyatli O'tish Bo'yicha Maslahatlar
- "Nega?" degan savolga javob bering: Shunchaki metod nomini aytish yetarli emas — Apple uni nega yaratgani va kapot ostida nima sodir bo'lishini tushuntiring.
- Zamonaviy standartlarni biling: iOS 26/27, Swift 6 Concurrency va
@Observablekabi yangiliklarni bilish sizni oddiy ishlab chiquvchilardan darhol ajratib ko'rsatadi. - Faktlarga tayaning: O'ylab topilgan taxminlar o'rniga, Apple'ning rasmiy hujjatlari va o'lchangan ko'rsatkichlarini keltiring.
Barcha Darslar Ro'yxati
- UIKit 1: View Ierarxiyasi va Koordinatalar Tizimi
- UIKit 2: Layout va Render Sikli
- UIKit 3: View Controller Hayot Sikli
- UIKit 4: Xotira va ARC
- UIKit 5: Apple Qurilmalari Dasturchilar Uchun
- UIKit 6: iOS 26 va iOS 27 Yangiliklari
- UIKit 7: SwiftUI Chuqur: Arxitektura va Samaradorlik
- UIKit 8: Real Crash, Concurrency va Memory Buglar