P
prepair.app
Пройти интервью →
EnglishУкраїнськаРусскийDeutsch
🍏

Middle iOS (Swift)Вопросы на собеседовании iOS разработчика

Middle · 2–4 года опыта

Собеседование iOS-разработчика проверяет систему типов Swift, понимание ARC и умение рассуждать о состоянии интерфейса — плюс обязательно найдётся вопрос, где retain cycle прячется на виду. Ниже — вопросы, которые задают чаще всего, каждый с эталонным ответом. Middle: более глубокое понимание, оптимизацию и реальные рабочие ситуации.

Попробовать — без регистрации
Готовим вопрос…

Темы для подготовки

Swift и опционалы
ARC и управление памятью
SwiftUI и UIKit
Конкурентность: async/await, Combine, GCD
Архитектура и состояние
Хранение данных и сеть

7 вопросов уровня Middle с ответами

1

Чем отличаются `@State`, `@Binding` и `@ObservedObject`?

Ответ

@State — значение, которым вью владеет и которое меняет. @Binding — ссылка на чужой @State, переданная вниз, чтобы дочерний мог писать. @ObservedObject наблюдает за ссылочным типом, публикующим изменения, и владеет им кто-то другой. Смежная ошибка — @ObservedObject там, где нужен @StateObject: объект тогда пересоздаётся на каждой перерисовке.

2

Чем `async/await` отличается от completion-хендлеров?

Ответ

Они выражают одно и то же приостановление, но await оставляет код линейным, а ошибки едут через throws, а не параметром, который можно забыть проверить. Компилятор к тому же обеспечивает структурную конкурентность: дочерние задачи отменяются вместе с родительской. Ловушка перехода — вызов async-функции из синхронного контекста, для которого нужен явный Task.

3

Что гарантирует `@MainActor`?

Ответ

Что помеченный код выполняется на главном потоке, и проверяет это компилятор, а не соглашение. Работа с UI обязана идти на главном, и до акторов это было рантайм-проверкой, о которой узнавали падением. Пометить вью-модель @MainActor обычно проще, чем диспетчеризовать на каждом вызове.

4

Зачем нужен `reuseIdentifier` и что ломается при небрежном переиспользовании?

Ответ

Затем, что таблица или коллекция держит небольшой пул ячеек и переиспользует их при прокрутке, а не создаёт по одной на строку. Ломается состояние, оставшееся от прежнего жильца: картинка из третьей строки, всплывшая в сороковой. Лечится prepareForReuse и отменой незавершённой загрузки изображения.

5

Как искать утечку памяти на iOS?

Ответ

Memory graph debugger показывает, что ещё живо и кто это держит, и обычно прямо называет цикл. Instruments с Leaks и Allocations отвечают на тот же вопрос во времени. Частые виновники — замыкания, сильно захватывающие self, делегат, объявленный strong вместо weak, и наблюдатели, которых не сняли.

6

Как удержать плавность прокрутки?

Ответ

Не делать ничего дорогого на главном потоке во время скролла: декодировать изображения вне главного, кешировать декодированный результат, а не данные, и избегать вёрстки, пересчитываемой каждый кадр. Тихий пункт — offscreen-рендеринг от теней и масок: скругление с masksToBounds на множестве ячеек стоит больше, чем кажется.

7

Как разумно обработать ошибки сетевого слоя?

Ответ

Смоделировать их: типизированная ошибка, различающая отсутствие связи, серверную 5xx, вашу 4xx и провал декодирования, потому что каждая заслуживает своего сообщения и своей политики повтора. Провал — бесконечно повторять 400. Ошибки декодирования особенно должны быть громкими в разработке и никогда не проглатываться молча.

🦎

Прочитать ответы недостаточно

На собеседовании ты говоришь вслух под давлением. Кем задаст эти же вопросы, оценит каждый ответ и покажет, что именно подтянуть.

Пройти интервью Middle iOS (Swift) →
Бесплатно · 3 интервью в месяц

Другие уровни — iOS (Swift)

Junior iOS (Swift)Senior iOS (Swift)Все вопросы iOS (Swift)

Другие специализации

🔍Middle QA Manual🤖Middle QA AutomationMiddle Java Backend🐍Middle Python Backend🐘Middle PHP Backend🦫Middle Go Backend🟢Middle Node.js Backend💎Middle Ruby on Rails🟣Middle .NET Backend Developer🔷Middle C++