При ревю чужих репозиториев я сразу вижу стандартный расклад ошибок: хаос в storyboard, самописные однострочные патчи под дедлайн, отсутствие unit-тестов, статические анализаторы выключены. Ниже фиксирую группу ловушек, в которые авторы падают чаще всего.

Профилируй прежде оптимизации
Xcode Instruments прожигает процессор, но спасает время пользователя. Я первым делом измеряю реальный горячий путь. Без замеров разработчик впаивает микропатчи, которые пугают кэш и Л1-предиктор, а выигрыш равен нулю. Классический пример — загрузка таблицы с JSON: коллега конвертировал строки в модели на бэкграунде, но main-thread всё равно ждал сериализатор в одном месте. Таймер показал 16 мс ожидания, тогда как батч-десериализация через Codable упала до 3 мс. Диагноз: оптимизация раньше данных.
Управление памятью без утечек
ARC автоматизирует retain/release, однако захваты в замыканиях регулярно формируют retain-петли. Я встречал UIViewController, который жил дольше сессии пользователя из-за single-shot NotificationCenter. Weak-ссылка решает вопрос за секунду. Поверх петли часто сидит кеш изображений, созданный как singleton-структура без eviction-политики. Instruments Leaks рисует пилообразный график, EFI троттлит. Я включаю autoreleasepool в циклические задачи и проверяю deinit при каждом ревю.
Диета для UIViewController
ViewController-монолиты раздуваются до размеров Генри Бестона, судьба таких файлов — конфликт при любом мердже. Я держу верхний порог 300 строк, разбрасываю логику по презентерам, интеракторам, фабрикам. При выходе за лимит Xcode тормозит автокомплит, команда теряет секунды каждый билд. Беспристрастный линтер SwiftLint срабатывает на правило file_length, CI отклоняет pull-request. Психологический эффект: команда перестаёт лепить костыль, предпочитая модуль.
Сетевой слой иногда встречаю без idempotency-ключей. Повторный tap на кнопку оплаты инициирует дубликаты транзакций. Правило простое: endpoint POST включает уникальный токен, сервер возвращает 409 при коллизии. Клиент хранит UUID в соседнем OperationQueue и отменяет лишние операции.
В роадмапах вижу «бесконечную бету»: сборку заливают в TestFlight по пятнадцать раз за день, аналитика теряет контекст. Семантический тег build-number-get-sha решает трассировку, а чёткий freeze-день дисциплинирует команду.
Русский текст запекают в storyboard. При первом корейском переводе макет лопается как переспелый гранат. Я выношу строки в Localizable.strings dict, выставляю AutoLayout hugging-priority и закрываю тикет без допиливаний.
VoiceOver читает экран, но разработчик забывает навигационный порядок. Пользователь с брайлевским дисплеем блуждает по UI. Атрибут accessibility Identifier и order-strategy решают задачу в три минуты.
Push-payload приходит с ключом alert, разработчик парсить вручную. UN Notification Service Extension принимает JSON, декорирует контент, экономит батарею, UX выигрывает.
Grand Central Dispatch нагружает serial-queue heavy-IO, где уместен concurrent-queue с barrier-флагом. Блокировки исчезают, FPS поднимается выше 55.
Сводка проста: я держу инструментарий рядом, замеряю, распиливаю логику, уважаю память и время. App Store ревю проходит гладко, crash-аналитика молчит.













