Вопросы на собеседовании: iOS
Курс собран из вопросов, которые действительно звучат на собеседованиях iOS-разработчика — от «чем struct отличается от class» до «как вы искали утечку памяти» и «почему выбрали такую архитектуру». Каждый урок разбирает вопрос по одной схеме: что за ним стоит на самом деле, развёрнутый ответ с кодом на Swift, типичные ошибки кандидатов и короткая версия ответа на 20–30 секунд. Прогрессия — от junior к senior: семантика типов, ARC и утечки, многопоточность и конкурентность, UIKit и SwiftUI, архитектура и тестируемость.
Курс «Вопросы на собеседовании: iOS» состоит из 5 разделов и 15 уроков: Swift: типы и семантика, Управление памятью и ARC, Многопоточность и конкурентность, UIKit и SwiftUI и Архитектура и практика. Уроки идут по порядку — от основ к более сложным темам, в каждом есть объяснение с примерами, а в конце — вопросы для самопроверки. К урокам привязаны задачи с автоматической проверкой: прочитали тему — сразу закрепили её кодом.
Программа курса
1 Swift: типы и семантика
- Value type против reference type
Чем struct отличается от class в Swift: копирование, copy-on-write и isKnownUniquelyReferenced, mutating, identity через ===, и как выбрать на собеседовании.
- Опционалы и безопасная распаковка
Optional в Swift изнутри: enum .none и .some, if let против guard let, nil-coalescing, optional chaining, двойной опционал, IUO и честные случаи force unwrap.
- Протоколы и дженерики: protocol-oriented programming
POP в Swift на собеседовании: protocol extension и статическая диспетчеризация, композиция контрактов, associatedtype и type erasure, разница между some и any.
- Value type против reference type
2 Управление памятью и ARC
- Как работает ARC
Как устроен ARC в Swift, чем он отличается от garbage collector, когда именно вызывается deinit и почему ARC не умеет разрывать циклы ссылок.
- strong, weak и unowned: что выбрать
Чем weak отличается от unowned в Swift, как работает side table и zeroing weak reference, почему weak должна быть var и Optional, таблица-памятка выбора.
- Циклы сильных ссылок, захват self и поиск утечек
Retain cycle в Swift: два класса и замыкание с self, capture list [weak self], escaping и non-escaping, Timer и invalidate, поиск утечек через deinit и Instruments.
- Как работает ARC
3 Многопоточность и конкурентность
- GCD: очереди, QoS и главный поток
Собеседование iOS: чем serial-очередь отличается от concurrent, что будет при обновлении UI из фона и почему DispatchQueue.main.sync с главного потока — deadlock.
- async/await и структурная конкурентность
Собеседование iOS: что даёт async/await против completion handler, чем async let отличается от TaskGroup и что происходит с потоком в точке приостановки.
- Актёры, гонки данных и отмена задач
Собеседование iOS: что такое actor и его реентерабельность, чем data race отличается от race condition и почему отмена Task в Swift кооперативная.
- GCD: очереди, QoS и главный поток
4 UIKit и SwiftUI
- Жизненный цикл UIViewController
Порядок методов UIViewController от loadView до viewDidDisappear, чем viewDidLoad отличается от viewWillAppear, почему нельзя задавать frame во viewDidLoad.
- Auto Layout и переиспользование ячеек UITableView
Content hugging против compression resistance, приоритеты констрейнтов, dequeueReusableCell и prepareForReuse, гонка загрузки картинок и ускорение UITableView.
- SwiftUI: @State, @Binding, @ObservedObject и когда что выбирать
Чем SwiftUI отличается от UIKit, разница @State, @Binding, @StateObject, @ObservedObject и @EnvironmentObject, макрос @Observable из iOS 17 и identity во ForEach.
- Жизненный цикл UIViewController
5 Архитектура и практика
- MVC, MVVM, VIPER и координаторы
Честное сравнение MVC, MVVM, VIPER и Clean Architecture на собеседовании: почему контроллер распухает, что даёт ViewModel без UIKit и зачем нужны координаторы.
- Сеть, Codable, кэширование и персистентность
Сетевой слой на URLSession и async/await, разбор JSON через Codable и CodingKeys, кастомный init(from:), выбор хранилища: Keychain, UserDefaults, Core Data, URLCache, NSCache.
- Тестируемость и внедрение зависимостей
Dependency injection в iOS: внедрение через инициализатор, свойство и метод, протоколы вместо конкретных классов, mock и XCTest, вред синглтонов, что тестировать в первую очередь.
- MVC, MVVM, VIPER и координаторы