# UIKit — Interview Savollari va Javoblari

Ushbu qo'llanmada **UIKit framework'i** bo'yicha eng ko'p so'raladigan **50 ta savol va javoblar** jamlangan. UIKit hali ham ko'plab loyihalarda asosiy UI framework sifatida ishlatilmoqda va suhbatlarda chuqur savolar beriladi.

---

## 1. UIView va Layout Asoslari

### 1. UIView nima va uning vazifasi?
**Javob:** UIView — ekrandagi barcha vizual elementlarning asosiy klassi. U:
*   Elementlarni chizish (rendering)
*   Foydalanuvchi teginishlarini (touches) qabul qilish
*   Bola elementlarni (subviews) boshqarish
*   Animatsiyalarni bajarish

### 2. `frame` va `bounds` farqi?
**Javob:**
*   **frame** — ota view (superview) koordinatalari tizimida joylashuv va o'lcham.
*   **bounds** — o'z ichki koordinatalari tizimida joylashuv (odatda 0,0) va o'lcham.

```swift
let view = UIView(frame: CGRect(x: 50, y: 100, width: 200, height: 150))
print(view.frame)   // (50, 100, 200, 150) — ota ichidagi joyi
print(view.bounds)  // (0, 0, 200, 150) — o'z ichki o'lchami
```

> 💡 View aylantirilganda (rotation) `frame` o'zgaradi, `bounds` esa o'zgarmaydi.
> 💡 Batafsil: [UIKit 1 — View Ierarxiyasi va Koordinatalar Tizimi](/ios-lessons/uikit-view-hierarchy)

### 3. Auto Layout nima va nega kerak?
**Javob:** Auto Layout — turli ekran o'lchamlarida (iPhone SE dan iPad Pro gacha) UI elementlarini to'g'ri joylashtirishni ta'minlovchi constraint-based layout tizimi. Frame asosida yozilgan UI faqat bitta ekran o'lchamida to'g'ri ko'rinadi.

### 4. Constraint'lar qanday yaratiladi?
**Javob:** 4 ta usul:
1. **Storyboard/XIB:** Vizual chizish
2. **NSLayoutConstraint:** Kodda aniq yaratish
3. **Visual Format Language (VFL):** String asosida
4. **NSLayoutAnchor:** Eng zamonaviy va qulay

```swift
// Eng tavsiya etiladigan usul — Anchors
let label = UILabel()
label.translatesAutoresizingMaskIntoConstraints = false
view.addSubview(label)

NSLayoutConstraint.activate([
    label.centerXAnchor.constraint(equalTo: view.centerXAnchor),
    label.centerYAnchor.constraint(equalTo: view.centerYAnchor),
    label.widthAnchor.constraint(equalToConstant: 200),
    label.heightAnchor.constraint(equalToConstant: 44)
])
```

> ⚠️ `translatesAutoresizingMaskIntoConstraints = false` yozish esdan chiqsa — constraint'lar ishlamaydi!

### 5. `intrinsicContentSize` nima?
**Javob:** Ba'zi UI elementlari (UILabel, UIButton, UIImageView) o'z kontentiga qarab o'lchamini biladi. Bu ularga kenglik/balandlik constraint bermasdan ham ishlash imkonini beradi.

### 6. Content Hugging va Compression Resistance Priority?
**Javob:**
*   **Content Hugging:** Element o'z kontentidan **kattaroq** bo'lmasligini ixtiyori. Priority yuqori → semirib ketmaydi.
*   **Compression Resistance:** Element o'z kontentidan **kichikroq** bo'lmasligini ixtiyori. Priority yuqori → siqilib ketmaydi.

```swift
label.setContentHuggingPriority(.required, for: .horizontal)
label.setContentCompressionResistancePriority(.required, for: .horizontal)
```

### 7. Safe Area nima?
**Javob:** iPhone X dan boshlab paydo bo'lgan "xavfsiz maydon". Notch (tirnoq), Dynamic Island va Home Indicator ostida kontent qolmasligi uchun:

```swift
label.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor)
```

### 8. `UIStackView` afzalligi?
**Javob:** Elementlarni vertikal/gorizontal joylashtirishda faqat bitta constraint (position) bilan ishlaydi. Constraint'larni qo'lda yozish shart emas. Element yashirilganda (`isHidden = true`) bo'shliq avtomatik yopiladi.

```swift
let stack = UIStackView(arrangedSubviews: [label1, label2, label3])
stack.axis = .vertical
stack.spacing = 8
stack.distribution = .fillEqually
```

### 9. `layoutSubviews()` va `setNeedsLayout()` farqi?
**Javob:**
*   `setNeedsLayout()` — keyingi layout cycle'da `layoutSubviews()` chaqirilishini belgilaydi.
*   `layoutIfNeeded()` — darhol (sync) layout'ni yangilaydi.
*   `layoutSubviews()` — o'zingiz chaqirmang, override qiling.
> 💡 Batafsil: [UIKit 2 — Layout va Render Sikli](/ios-lessons/uikit-layout-cycle)

### 10. `UIWindow` nima?
**Javob:** Ilovadagi barcha UI elementlarining "ildizi" (root). Har bir ilova kamida bitta UIWindow'ga ega. U ekranga chizishning eng yuqori darajali konteyneridir.

---

## 2. View Controller va Navigation

### 11. UIViewController Life Cycle?
**Javob:**

```
loadView()          → View'ni yaratish (odatda override qilmaymiz)
    ↓
viewDidLoad()       → View xotiraga yuklandi (bir marta). Setup ishlari.
    ↓
viewWillAppear()    → Ekranga chiqish arafasida. Har safar chaqiriladi.
    ↓
viewIsAppearing()   → (iOS 13+) Ekranga chiqmoqda, aniq trait va frame o'lchamlari tayyor.
    ↓
viewDidAppear()     → Ekranga to'liq chiqdi. Animatsiya boshlash.
    ↓
viewWillDisappear() → Ekrandan ketish arafasida.
    ↓
viewDidDisappear()  → Ekrandan ketdi. Timer to'xtatish.
```

> 💡 Batafsil: [UIKit 3 — View Controller Hayot Sikli](/ios-lessons/uikit-vc-lifecycle)

### 12. `viewDidLoad` vs `viewWillAppear` — qayerda nima yoziladi?
**Javob:**
*   `viewDidLoad`: **Bir marta** bajariladigan ishlar — UI yaratish, constraint'lar, initial data fetch.
*   `viewWillAppear`: **Har safar** ekran ko'ringanda — data refresh, navigation bar sozlamasi.

### 13. UINavigationController qanday ishlaydi?
**Javob:** Stack (to'plam) asosida ishlaydi. Yangi ekranlar `push` qilinadi (stackka qo'shiladi), ortga qaytish `pop` (stackdan olinadi):

```swift
// Yangi ekranga o'tish
navigationController?.pushViewController(detailVC, animated: true)

// Ortga qaytish
navigationController?.popViewController(animated: true)

// Root'ga qaytish
navigationController?.popToRootViewController(animated: true)
```

### 14. UITabBarController nima?
**Javob:** Ekran ostidagi tab bar orqali bir nechta bo'lim o'rtasida o'tish. Har bir tab o'z UINavigationController'iga ega bo'lishi mumkin.

### 15. Modal Presentation turlari?
**Javob:**
*   `.automatic` (default, iOS 13+) — card style (pastga surib yopish).
*   `.fullScreen` — butun ekranni qoplash.
*   `.overFullScreen` — orqa fon ko'rinadi (transparent).
*   `.pageSheet`, `.formSheet` — iPad uchun.

```swift
let vc = DetailViewController()
vc.modalPresentationStyle = .fullScreen
present(vc, animated: true)
```

### 16. `prepare(for segue:)` nima?
**Javob:** Storyboard'da ekranlar o'rtasida ma'lumot uzatish uchun:

```swift
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if let detailVC = segue.destination as? DetailViewController {
        detailVC.selectedItem = selectedItem
    }
}
```

### 17. Container View Controller nima?
**Javob:** Boshqa VC'larni o'z ichiga oladigan VC. `UINavigationController`, `UITabBarController` — built-in misollar. Custom ham yasash mumkin: `addChild()`, `willMove(toParent:)`, `didMove(toParent:)`.

### 18. `UIAlertController` ishlatish?
**Javob:**

```swift
let alert = UIAlertController(title: "Diqqat", message: "O'chirilsinmi?", preferredStyle: .alert)
alert.addAction(UIAlertAction(title: "Ha", style: .destructive) { _ in
    self.deleteItem()
})
alert.addAction(UIAlertAction(title: "Yo'q", style: .cancel))
present(alert, animated: true)
```

---

## 3. UITableView va UICollectionView

### 19. UITableView asosiy tushunchalari?
**Javob:** `UITableViewDataSource` — nechta row/section va cell konfiguratsiyasi, `UITableViewDelegate` — row tanlash, balandlik, swipe actions.

```swift
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return items.count
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)
    cell.textLabel?.text = items[indexPath.row]
    return cell
}
```

### 20. Cell Reuse mexanizmi?
**Javob:** 10 000 ta qator uchun 10 000 ta cell yaratilmaydi. Faqat ekranda ko'rinayotgan 10-12 tasi yaratiladi. Cell ekrandan chiqganda u **qayta ishlatish uchun qo'yiladi** (dequeue) va yangi ma'lumot bilan yangilanadi. Bu xotira va performansni oshiradi.

```swift
// Cell'ni ro'yxatdan o'tkazish
tableView.register(MyCell.self, forCellReuseIdentifier: "MyCell")

// Qayta ishlatish
let cell = tableView.dequeueReusableCell(withIdentifier: "MyCell", for: indexPath) as! MyCell
```

### 21. `prepareForReuse()` nega muhim?
**Javob:** Cell qayta ishlatilishidan oldin eski ma'lumotlarni tozalash uchun. Agar buni qilmasangiz — eski rasm yoki matn yangi cell'da ko'rinishi mumkin:

```swift
override func prepareForReuse() {
    super.prepareForReuse()
    imageView?.image = nil
    textLabel?.text = nil
}
```

### 22. UICollectionView va UITableView farqi?
**Javob:**
*   **UITableView** — faqat vertikal ro'yxat (bir ustun).
*   **UICollectionView** — istalgan yo'nalishda, istalgan layout (grid, carousel, Pinterest style).

### 23. UICollectionViewFlowLayout vs CompositionalLayout?
**Javob:**
*   **FlowLayout** — oddiy grid uchun (bir xil katakchalar).
*   **CompositionalLayout** (iOS 13+) — murakkab, seksiya asosidagi layout. Har bir seksiya o'z layoutiga ega bo'lishi mumkin.

### 24. DiffableDataSource nima?
**Javob:** iOS 13+ da taqdim etilgan. `reloadData()` o'rniga "Snapshot" yaratib, faqat o'zgargan elementlarni animatsiya bilan yangilaydi:

```swift
var dataSource: UITableViewDiffableDataSource<Section, Item>!

func updateUI(with items: [Item]) {
    var snapshot = NSDiffableDataSourceSnapshot<Section, Item>()
    snapshot.appendSections([.main])
    snapshot.appendItems(items)
    dataSource.apply(snapshot, animatingDifferences: true)
}
```

### 25. Prefetching nima?
**Javob:** Foydalanuvchi scroll qilayotganda, ekranga yaqinlashayotgan cell'lar uchun ma'lumotlarni oldindan yuklash:

```swift
func tableView(_ tableView: UITableView, prefetchRowsAt indexPaths: [IndexPath]) {
    for indexPath in indexPaths {
        loadImage(for: items[indexPath.row])
    }
}
```

---

## 4. Gesture va Event Handling

### 26. UIGestureRecognizer turlari?
**Javob:**
*   `UITapGestureRecognizer` — bosish
*   `UILongPressGestureRecognizer` — uzoq bosish
*   `UISwipeGestureRecognizer` — surish
*   `UIPanGestureRecognizer` — harakatlanish (drag)
*   `UIPinchGestureRecognizer` — kattalashtirish/kichiklashtirish
*   `UIRotationGestureRecognizer` — aylantirish

```swift
let tap = UITapGestureRecognizer(target: self, action: #selector(handleTap))
view.addGestureRecognizer(tap)

@objc func handleTap(_ gesture: UITapGestureRecognizer) {
    let point = gesture.location(in: view)
    print("Bosildi: \(point)")
}
```

### 27. Responder Chain nima?
**Javob:** Touch event'i qabul qilinmasa, u zanjir bo'ylab yuqoriga uzatiladi:

```
UIButton → UIView → UIViewController → UIWindow → UIApplication → AppDelegate
```

`hitTest(_:with:)` — qaysi view tegilganini aniqlaydi. `point(inside:with:)` — nuqta view ichidami tekstiradi.

### 28. `hitTest` qanday ishlaydi?
**Javob:** Eng yuqoridagi view'dan boshlab, barcha subview'larni teskari tartibda tekshiradi (eng oxirgisi — eng ustidagi). Teginish qaysi view ichida ekanini aniqlash uchun `point(inside:with:)` chaqiradi.

---

## 5. Animatsiya va Drawing

### 29. UIView Animation turlari?
**Javob:**

```swift
// Oddiy animatsiya
UIView.animate(withDuration: 0.3) {
    self.myView.alpha = 0
    self.myView.transform = CGAffineTransform(scaleX: 0.5, y: 0.5)
}

// Spring animatsiya
UIView.animate(withDuration: 0.5, delay: 0, usingSpringWithDamping: 0.6,
               initialSpringVelocity: 0.5) {
    self.myView.center = newPosition
}

// Keyframe animatsiya
UIView.animateKeyframes(withDuration: 1.0, delay: 0) {
    UIView.addKeyframe(withRelativeStartTime: 0, relativeDuration: 0.5) {
        self.myView.transform = CGAffineTransform(rotationAngle: .pi)
    }
    UIView.addKeyframe(withRelativeStartTime: 0.5, relativeDuration: 0.5) {
        self.myView.transform = .identity
    }
}
```

### 30. `CALayer` va UIView aloqasi?
**Javob:** Har bir UIView'da `layer` (CALayer) bor. UIView — touch events + wrapper. CALayer — haqiqiy chizish (GPU). Layer orqali: `cornerRadius`, `shadow`, `border`, `mask`.

```swift
view.layer.cornerRadius = 12
view.layer.borderWidth = 1
view.layer.borderColor = UIColor.gray.cgColor
view.layer.shadowColor = UIColor.black.cgColor
view.layer.shadowOffset = CGSize(width: 0, height: 2)
view.layer.shadowOpacity = 0.3
view.clipsToBounds = true
```

### 31. `CABasicAnimation` nima?
**Javob:** Core Animation orqali layer property'larini animatsiya qilish:

```swift
let animation = CABasicAnimation(keyPath: "transform.rotation")
animation.fromValue = 0
animation.toValue = Double.pi * 2
animation.duration = 1.0
animation.repeatCount = .infinity
view.layer.add(animation, forKey: "rotate")
```

### 32. `UIView.transition` nima qiladi?
**Javob:** View ichidagi kontentni animatsiya bilan almashtirish:

```swift
UIView.transition(with: imageView, duration: 0.3, options: .transitionCrossDissolve) {
    self.imageView.image = newImage
}
```

---

## 6. Storyboard, XIB va Programmatic UI

### 33. Storyboard, XIB va Programmatic UI farqlari?
**Javob:**

| Xususiyat | Storyboard | XIB | Programmatic |
|-----------|:---:|:---:|:---:|
| Vizual chizish | ✅ | ✅ | ❌ |
| Git Merge Conflict | ❌ Juda ko'p | ⚠️ O'rtacha | ✅ Deyarli yo'q |
| Reusability | ❌ Past | ✅ Yaxshi | ✅ Eng yaxshi |
| Build vaqti | ❌ Sekin | ⚠️ O'rtacha | ✅ Tez |
| Jamoaviy ish | ❌ Qiyin | ⚠️ O'rtacha | ✅ Oson |

### 34. `IBOutlet` va `IBAction` nima?
**Javob:**
*   `IBOutlet` — Storyboard/XIB'dagi UI elementni kodga bog'lash (property sifatida).
*   `IBAction` — UI hodisasini (tugma bosish) kodga bog'lash (method sifatida).

### 35. Programmatic UI qanday yoziladi?
**Javob:**

```swift
class ProfileViewController: UIViewController {
    
    private let nameLabel: UILabel = {
        let label = UILabel()
        label.text = "Azimjon"
        label.font = .systemFont(ofSize: 24, weight: .bold)
        label.translatesAutoresizingMaskIntoConstraints = false
        return label
    }()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        view.backgroundColor = .systemBackground
        view.addSubview(nameLabel)
        
        NSLayoutConstraint.activate([
            nameLabel.centerXAnchor.constraint(equalTo: view.centerXAnchor),
            nameLabel.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor, constant: 20)
        ])
    }
}
```

---

## 7. Networking va Data

### 36. URLSession data task (UIKit kontekstida)?
**Javob:**

```swift
func fetchUsers() {
    let url = URL(string: "https://api.example.com/users")!
    
    URLSession.shared.dataTask(with: url) { [weak self] data, response, error in
        guard let data = data, error == nil else { return }
        
        let users = try? JSONDecoder().decode([User].self, from: data)
        
        // ⚠️ MUHIM: UI faqat Main Thread'da yangilanadi!
        DispatchQueue.main.async {
            self?.users = users ?? []
            self?.tableView.reloadData()
        }
    }.resume() // ← resume() esdan chiqsa so'rov ketmaydi!
```

### 37. Image Loading va Caching?
**Javob:** To'g'ridan-to'g'ri `UIImage(data:)` ishlatish — sekin va xotira isrofi. Professional yondashuv:

```swift
// NSCache asosida oddiy kesh
class ImageCache {
    static let shared = ImageCache()
    private let cache = NSCache<NSString, UIImage>()
    
    func loadImage(from url: URL, completion: @escaping (UIImage?) -> Void) {
        let key = url.absoluteString as NSString
        
        if let cached = cache.object(forKey: key) {
            completion(cached)
            return
        }
        
        URLSession.shared.dataTask(with: url) { [weak self] data, _, _ in
            guard let data = data, let image = UIImage(data: data) else {
                completion(nil)
                return
            }
            self?.cache.setObject(image, forKey: key)
            DispatchQueue.main.async { completion(image) }
        }.resume()
    }
}
```

---

## 8. Design Patterns (UIKit kontekstida)

### 38. Delegate Pattern?
**Javob:** UIKit'ning asosiy pattern'i. Bir obyekt boshqasiga mas'uliyatni topshiradi:

```swift
protocol ItemSelectionDelegate: AnyObject {
    func didSelectItem(_ item: Item)
}

class ListViewController: UIViewController {
    weak var delegate: ItemSelectionDelegate?
    
    func userTappedItem(_ item: Item) {
        delegate?.didSelectItem(item) // Tashqariga xabar berish
    }
}
```

### 39. Target-Action Pattern?
**Javob:** UIButton, UISwitch kabi elementlarda amal biriktirish:

```swift
button.addTarget(self, action: #selector(buttonTapped), for: .touchUpInside)

@objc func buttonTapped() {
    print("Tugma bosildi")
}
```

### 40. NotificationCenter (Observer Pattern)?
**Javob:** Bir joydan xabar jo'natish, bir nechta joyda tinglash:

```swift
// Tinglash
NotificationCenter.default.addObserver(self, selector: #selector(handleLogin),
                                       name: .userDidLogin, object: nil)

// Yuborish
NotificationCenter.default.post(name: .userDidLogin, object: nil, userInfo: ["userId": 123])
```

---

## 9. Advanced UIKit

### 41. Coordinator Pattern?
**Javob:** Navigation logic'ni VC'lardan ajratish:

```swift
protocol Coordinator {
    var navigationController: UINavigationController { get }
    func start()
}

class AppCoordinator: Coordinator {
    let navigationController: UINavigationController
    
    func start() {
        let vc = HomeViewController()
        vc.onItemSelected = { [weak self] item in
            self?.showDetail(item)
        }
        navigationController.pushViewController(vc, animated: false)
    }
    
    func showDetail(_ item: Item) {
        let vc = DetailViewController(item: item)
        navigationController.pushViewController(vc, animated: true)
    }
}
```

### 42. `UIScrollView` contentSize va contentOffset?
**Javob:**
*   `contentSize` — scroll qilinadigan kontent hajmi (ekrandan katta).
*   `contentOffset` — hozir ekran qaysi nuqtada turibdi.
*   `contentInset` — kontent atrofidagi bo'shliq.

### 43. `UISearchController` ishlatish?
**Javob:**

```swift
let searchController = UISearchController(searchResultsController: nil)
searchController.searchResultsUpdater = self
searchController.obscuresBackgroundDuringPresentation = false
navigationItem.searchController = searchController

// UISearchResultsUpdating
func updateSearchResults(for searchController: UISearchController) {
    let query = searchController.searchBar.text ?? ""
    filteredItems = items.filter { $0.name.contains(query) }
    tableView.reloadData()
}
```

### 44. `UIPageViewController` nima?
**Javob:** Sahifalar o'rtasida o'ngga-chapga surish (swipe) orqali o'tish uchun. Onboarding ekranlarida ko'p ishlatiladi.

### 45. `UIContextMenuConfiguration` (iOS 13+)?
**Javob:** Uzoq bosishda (long press) kontekst menyu ko'rsatish:

```swift
func tableView(_ tableView: UITableView, 
               contextMenuConfigurationForRowAt indexPath: IndexPath, 
               point: CGPoint) -> UIContextMenuConfiguration? {
    return UIContextMenuConfiguration(identifier: nil, previewProvider: nil) { _ in
        let delete = UIAction(title: "O'chirish", image: UIImage(systemName: "trash"), 
                            attributes: .destructive) { _ in
            self.deleteItem(at: indexPath)
        }
        return UIMenu(children: [delete])
    }
}
```

### 46. `UIAppearance` nima?
**Javob:** Butun ilovadagi barcha bir turdagi UI elementlarni bir joydan sozlash:

```swift
// Barcha navigation bar'larni sozlash
UINavigationBar.appearance().tintColor = .systemBlue
UINavigationBar.appearance().prefersLargeTitles = true

// Barcha UISwitch'larni sozlash
UISwitch.appearance().onTintColor = .systemGreen
```

### 47. `UIPasteboard` va Clipboard?
**Javob:** Nusxa olish (copy) va joylash (paste):

```swift
// Nusxa olish
UIPasteboard.general.string = "Nusxalangan matn"

// Joylash
if let text = UIPasteboard.general.string {
    textField.text = text
}
```

### 48. `UIActivityViewController` (Share sheet)?
**Javob:** Kontentni ulashish (share):

```swift
let items: [Any] = ["Salom!", URL(string: "https://apple.com")!]
let vc = UIActivityViewController(activityItems: items, applicationActivities: nil)
present(vc, animated: true)
```

### 49. Dark Mode qo'llab-quvvatlash (UIKit)?
**Javob:**

```swift
// Semantic ranglar ishlatish
view.backgroundColor = .systemBackground // light → oq, dark → qora
label.textColor = .label                 // light → qora, dark → oq

// Rejimni aniqlash (iOS 17+ da registerForTraitChanges tavsiya etiladi; eski usul: traitCollectionDidChange)
override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {
    super.traitCollectionDidChange(previousTraitCollection)
    if traitCollection.userInterfaceStyle == .dark {
        print("Dark mode yondi")
    }
}
```

> 💡 Batafsil: [UIKit 3 — View Controller Hayot Sikli](/ios-lessons/uikit-vc-lifecycle)

### 50. `UIViewController` xotira boshqaruvi?
**Javob:**

```swift
class MyViewController: UIViewController {
    var timer: Timer?
    
    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        timer = Timer.scheduledTimer(withTimeInterval: 1, repeats: true) { [weak self] _ in
            self?.updateUI() // ← [weak self] — memory leak oldini olish
        }
    }
    
    override func viewDidDisappear(_ animated: Bool) {
        super.viewDidDisappear(animated)
        timer?.invalidate() // ← Timer'ni to'xtatish SHART
        timer = nil
    }
    
    deinit {
        print("VC xotiradan o'chirildi ✅")
    }
}
```

> 💡 Batafsil: [UIKit 4 — Xotira va ARC](/ios-lessons/uikit-memory) va [UIKit 8 — Real Crash, Concurrency va Memory Buglar](/ios-lessons/uikit-problems-solutions)

---
### Yakuniy Maslahat:
UIKit haqida savollar tushganda **"Lifecycle"** va **"Memory Management"** haqida albatta gapiring. VC'larning hayot sikli (viewDidLoad/viewWillAppear), Cell reuse, va `[weak self]` — bu UIKit'dagi eng ko'p so'raladigan mavzular. Amaliy loyihangizdan misollar ko'rsating! 📱
