Avatar ·

SourceKitService Terminated: Xcode вылетает при редактировании Swift кода

Привет! У меня постоянно вылетает Xcode с ошибкой "SourceKitService Terminated". Это происходит, когда я редактирую Swift файлы. Ошибка появляется внезапно: я пишу код, и Xcode зависает на 5-10 секунд, а затем выскакивает это сообщение. После этого автодополнение перестаёт работать, подсветка синтаксиса исчезает, и Xcode становится практически бесполезным, пока я не перезапущу его. Вот пример кода, над которым я работаю: ```swift class DataManager { var items: [String] = [] func processData() { let filtered = items.filter { $0.count > 5 } let mapped = filtered.map { $0.uppercased() } // Здесь часто происходит краш let result = mapped.sorted { $0 < $1 } print(result) } func loadData() { // Загрузка данных из сети DispatchQueue.global().async { [weak self] in guard let self = self else { return } // Тут тоже вылетает self.items = ["apple", "banana", "cherry"] DispatchQueue.main.async { self.processData() } } } } ``` Проблема возникает не всегда, но особенно часто, когда я работаю с большими файлами (более 500 строк) или когда в проекте много файлов. У меня MacBook Air 2020 (Intel), Xcode 14, macOS Ventura. Пробовал чистить Derived Data, перезагружать Mac, но проблема возвращается. Что делать? Может, это связано с памятью или настройками Xcode? <<>>

Почему возникает 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.