SourceKitService Terminated: Xcode вылетает при редактировании Swift кода
Почему возникает SourceKitService Terminated
SourceKitService — это фоновый процесс Xcode, отвечающий за автодополнение, подсветку синтаксиса, рефакторинг и анализ кода на лету. Он работает как отдельный сервис, и когда он "падает", Xcode теряет эти функции. Основные причины:
- Недостаток оперативной памяти (особенно на Mac с 8GB RAM)
- Слишком большой или сложный проект
- Баг в версии Xcode или Swift
- Повреждённые кэши компилятора
Шаг 1: Очистка кэшей (быстрое решение)
Закройте Xcode и выполните в терминале:
rm -rf ~/Library/Developer/Xcode/DerivedData/*
rm -rf ~/Library/Caches/com.apple.dt.Xcode/*
rm -rf ~/Library/Developer/Xcode/UserData/IDEFindNavigatorScopes.plist
После этого перезапустите Xcode. Это удалит временные файлы, которые могли повредиться.
Шаг 2: Увеличение лимита памяти для SourceKitService
SourceKitService имеет ограничение по памяти (обычно 256MB). Если ваш проект превышает этот лимит, сервис падает. Увеличьте его через терминал:
defaults write com.apple.dt.Xcode IDEIndexerClangQueryCacheSizeLimit 0
defaults write com.apple.dt.Xcode IDESourceKitServiceMaxMemory 1024
Первая команда отключает лимит кэша Clang, вторая устанавливает лимит памяти SourceKitService в 1024 MB. После выполнения перезагрузите Mac.
Шаг 3: Оптимизация вашего кода
Проблема может быть в сложных замыканиях или цепочках вызовов. Ваш код с filter, map и sorted — это типичный триггер. SourceKitService пытается вывести типы на каждом шаге, что нагружает его. Попробуйте разбить цепочку на отдельные шаги с явными типами:
func processData() {
// Явно указываем типы для снижения нагрузки на SourceKit
let filtered: [String] = items.filter { $0.count > 5 }
let mapped: [String] = filtered.map { $0.uppercased() }
let result: [String] = mapped.sorted { $0 < $1 }
print(result)
}
Также избегайте сложных замыканий в асинхронных блоках. В вашем loadData() используйте более простую конструкцию:
func loadData() {
DispatchQueue.global().async { [weak self] in
guard let self = self else { return }
let newItems = ["apple", "banana", "cherry"]
DispatchQueue.main.async {
self.items = newItems
self.processData()
}
}
}
Шаг 4: Отключение некоторых функций Xcode
Временно отключите:
- Автодополнение (Preferences → Text Editing → Editing → "Suggest completions")
- Live Issues (Preferences → General → "Show live issues")
- Индексирование для больших файлов (File → Workspace Settings → "Enable index-while-building" — отключите)
Это снизит нагрузку на SourceKitService, но вы потеряете часть удобств.
Шаг 5: Обновление Xcode и macOS
Убедитесь, что у вас последняя версия Xcode (сейчас 15.4). Если у вас Intel Mac, рассмотрите переход на Xcode 15.3 — в ней исправлено много багов с SourceKitService. Также проверьте, что macOS обновлена до последней версии.
Если ничего не помогло
Создайте новый проект и перенесите код по частям. Если проблема исчезнет — значит, повреждён файл проекта (.xcodeproj или .xcworkspace). В крайнем случае, переустановите Xcode полностью:
sudo rm -rf /Applications/Xcode.app
# Скачайте новую версию с developer.apple.com
<<Альтернатива: Использование SwiftLint и модульности
Часто SourceKitService падает из-за слишком большого количества файлов в одной цели (target). Разбейте проект на модули:
// Создайте отдельный модуль для DataManager
// В Xcode: File → New → Target → Framework
// Перенесите туда класс DataManager
// В основном проекте импортируйте модуль:
import DataManagerModule
let manager = DataManager()
manager.loadData()
Это снизит нагрузку на SourceKitService, так как каждый модуль индексируется отдельно.
Автоматизация очистки
Создайте скрипт, который чистит кэши перед каждым запуском:
#!/bin/bash
# clean_sourcekit.sh
rm -rf ~/Library/Developer/Xcode/DerivedData/*
echo "DerivedData cleaned"
Добавьте его как "Run Script" в Build Phases вашего проекта. Это гарантирует, что кэши всегда свежие.
Аппаратное решение
Если у вас Mac с 8GB RAM, рассмотрите апгрейд до 16GB. SourceKitService потребляет много памяти, особенно при работе с большими проектами. На MacBook Air с 8GB и Intel процессором проблема почти гарантирована.
Также проверьте Activity Monitor: если процесс "SourceKitService" потребляет >500MB памяти, это явный признак утечки. В этом случае помогает только перезапуск Xcode.