Мобильная разработка

Вопросы на собеседовании: iOS

15 уроков · 5 разделов · бесплатно, без регистрации

Курс собран из вопросов, которые действительно звучат на собеседованиях iOS-разработчика — от «чем struct отличается от class» до «как вы искали утечку памяти» и «почему выбрали такую архитектуру». Каждый урок разбирает вопрос по одной схеме: что за ним стоит на самом деле, развёрнутый ответ с кодом на Swift, типичные ошибки кандидатов и короткая версия ответа на 20–30 секунд. Прогрессия — от junior к senior: семантика типов, ARC и утечки, многопоточность и конкурентность, UIKit и SwiftUI, архитектура и тестируемость.

Курс «Вопросы на собеседовании: iOS» состоит из 5 разделов и 15 уроков: Swift: типы и семантика, Управление памятью и ARC, Многопоточность и конкурентность, UIKit и SwiftUI и Архитектура и практика. Уроки идут по порядку — от основ к более сложным темам, в каждом есть объяснение с примерами, а в конце — вопросы для самопроверки. К урокам привязаны задачи с автоматической проверкой: прочитали тему — сразу закрепили её кодом.

Программа курса

  1. 1 Swift: типы и семантика

    1. Value type против reference type

      Чем struct отличается от class в Swift: копирование, copy-on-write и isKnownUniquelyReferenced, mutating, identity через ===, и как выбрать на собеседовании.

    2. Опционалы и безопасная распаковка

      Optional в Swift изнутри: enum .none и .some, if let против guard let, nil-coalescing, optional chaining, двойной опционал, IUO и честные случаи force unwrap.

    3. Протоколы и дженерики: protocol-oriented programming

      POP в Swift на собеседовании: protocol extension и статическая диспетчеризация, композиция контрактов, associatedtype и type erasure, разница между some и any.

  2. 2 Управление памятью и ARC

    1. Как работает ARC

      Как устроен ARC в Swift, чем он отличается от garbage collector, когда именно вызывается deinit и почему ARC не умеет разрывать циклы ссылок.

    2. strong, weak и unowned: что выбрать

      Чем weak отличается от unowned в Swift, как работает side table и zeroing weak reference, почему weak должна быть var и Optional, таблица-памятка выбора.

    3. Циклы сильных ссылок, захват self и поиск утечек

      Retain cycle в Swift: два класса и замыкание с self, capture list [weak self], escaping и non-escaping, Timer и invalidate, поиск утечек через deinit и Instruments.

  3. 3 Многопоточность и конкурентность

    1. GCD: очереди, QoS и главный поток

      Собеседование iOS: чем serial-очередь отличается от concurrent, что будет при обновлении UI из фона и почему DispatchQueue.main.sync с главного потока — deadlock.

    2. async/await и структурная конкурентность

      Собеседование iOS: что даёт async/await против completion handler, чем async let отличается от TaskGroup и что происходит с потоком в точке приостановки.

    3. Актёры, гонки данных и отмена задач

      Собеседование iOS: что такое actor и его реентерабельность, чем data race отличается от race condition и почему отмена Task в Swift кооперативная.

  4. 4 UIKit и SwiftUI

    1. Жизненный цикл UIViewController

      Порядок методов UIViewController от loadView до viewDidDisappear, чем viewDidLoad отличается от viewWillAppear, почему нельзя задавать frame во viewDidLoad.

    2. Auto Layout и переиспользование ячеек UITableView

      Content hugging против compression resistance, приоритеты констрейнтов, dequeueReusableCell и prepareForReuse, гонка загрузки картинок и ускорение UITableView.

    3. SwiftUI: @State, @Binding, @ObservedObject и когда что выбирать

      Чем SwiftUI отличается от UIKit, разница @State, @Binding, @StateObject, @ObservedObject и @EnvironmentObject, макрос @Observable из iOS 17 и identity во ForEach.

  5. 5 Архитектура и практика

    1. MVC, MVVM, VIPER и координаторы

      Честное сравнение MVC, MVVM, VIPER и Clean Architecture на собеседовании: почему контроллер распухает, что даёт ViewModel без UIKit и зачем нужны координаторы.

    2. Сеть, Codable, кэширование и персистентность

      Сетевой слой на URLSession и async/await, разбор JSON через Codable и CodingKeys, кастомный init(from:), выбор хранилища: Keychain, UserDefaults, Core Data, URLCache, NSCache.

    3. Тестируемость и внедрение зависимостей

      Dependency injection в iOS: внедрение через инициализатор, свойство и метод, протоколы вместо конкретных классов, mock и XCTest, вред синглтонов, что тестировать в первую очередь.