115

这不是 Beta 版问题。我在 Xcode 6.0.1,生产版本。我遇到的问题是,当我尝试构建或运行我正在处理的代码时,Xcode 在很长一段时间内变得无响应,并且 SourceKitService 消耗了 400% 以上的 CPU(根据活动监视器)。这个问题是最近几天的新问题,但奇怪的是,自从 9 月 17 日正式发布以来,我一直在使用 Xcode 6.0。我升级到 6.0.1,希望它能够修复这个问题。

关于问题可能是什么的任何想法?

4

26 回答 26

160

今天下午早些时候在 Xcode 6.1.1 中遇到了这个问题(不是测试版,官方发布的版本)。我一直在 Playground 上运行一些代码,并怀疑这就是原因。CPU 接近 100%,Xcode 无法完成构建。

所以这就是我所做的:

1. 打开“Activity Monitor”,显示 SourceKitService 为主 CPU。

2. 在“活动监视器”中,双击 SourceKitService 并单击“打开文件和端口”部分,这表明它正在处理 /Users/myname/Library/Developer/Xcode/DerivedData/ModuleCache/ 目录下的文件对于特定文件夹。

3. 删除指定的文件夹(从命令行,使用 rm -rf)。缓存是根据Can I safe delete of Xcode Derived data folder 的内容重新生成的?.

4.再次使用Activity Monitor,Force-Quit SourceKitServer。在 Xcode 中看到现在非常熟悉的标志说 SourceKitService 已崩溃(这就是 SourceKitService 听起来很熟悉的原因!)。

5. 重复步骤 3。

Mac 又是平静的。没有数据丢失,甚至不必重新启动 Xcode(我曾尝试过但未成功)。底线是 ModuleCache 似乎在循环中获取 SourceKitService 并且删除文件夹似乎可以修复它。希望这对你也有效。

引导说明:

顺便说一句,SourceKitService 问题的原因是我的 Swift 类中的数组声明太长了。我在一个数组中有超过 200 个条目。将其减少到 30 并且错误消失了。所以这个问题可能是由于苹果代码中的某种堆栈溢出(双关语)引起的。

于 2015-01-28T02:27:40.077 回答
24

我看到了这个问题,因为我声明了一个包含大约 60 个元素的数组,如下所示:

let byteMap = [

["ECG" : (0,12)],
["PPG" : (12,3)],
["ECG" : (15,12)],
["PPG" : (27,3)],
["ECG" : (30,12)]

通过像这样显式注释类型:

let byteMap : [String: (Int, Int)] = [

["ECG" : (0,12)],
["PPG" : (12,3)],
["ECG" : (15,12)],
["PPG" : (27,3)],
["ECG" : (30,12)],

我能够让它停下来。我认为这一定与 Swift 的类型推断和类型检查有关,它在遇到长数组时会进入循环。

这是在 Xcode 6.2 中。如上所述,我还删除了 ModuleCache,现在一切都很好。

于 2015-03-18T18:06:36.110 回答
11

这个问题发生了 10 次,当我连接实际设备并且没有通过模拟器运行时发生了 8 次。

我不太确定我的解决方案是否是一个好的解决方案,但对我来说,我相信问题是由于在模拟器和实际设备之间切换造成的。这听起来可能很奇怪,但它好像在缓存文件之间造成干扰

什么解决了我的问题:

  • 清理构建文件夹:(在 Xcode 上)Alt + Shift + Command + K
  • 重置内容和设置:(在模拟器上)Command + Shift + K
  • 等待的时间比正常时间长一点,并且不断点击使 Xcode 过载

所以基本上在你尝试在任何新设备上运行之前,只需删除任何缓存。

编辑

我只是在没有任何设备连接的情况下遇到了问题。我刚刚退出 Xcode 并再次打开它,问题就消失了。不确定我的猜测是在您获取/拉取合并新代码后可能是一些重新索引问题。

于 2016-08-10T17:14:09.480 回答
4

我解决了另一个导致 SourceKitService 使用高达 13GB 内存的问题......

我有字符串(格式行有很多参数:

return String(format: "%d,%.3f,%.3f,%.3f,%.3f,%.3f,%.3f,%.3f,%.3f,%.3f,%.3f,%.3f,%.3f,%.3f,%.3f,%.3f,%.3f,%.3f,%.3f", samples.count,sum1.x,sum1.y,sum1.z,sum1.rx,sum1.ry,sum1.rz,sum2.x,sum2.y,sum2.z,sum2.rx,sum2.ry,sum2.rz,sum3.x,sum3.y,sum3.z,sum3.rx,sum3.ry,sum3.rz)

当用它替换它时它工作正常(没有内存积累和正常的 CPU 消耗)

    var output: String = ""

    output += String(format: "%d,", samples.count)
    output += String(format: "%.3f,%.3f,%.3f,", sum1.x, sum1.y, sum1.z)
    output += String(format: "%.3f,%.3f,%.3f,", sum1.rx, sum1.ry, sum1.rz)
    output += String(format: "%.3f,%.3f,%.3f,", sum2.x, sum2.y, sum2.z)
    output += String(format: "%.3f,%.3f,%.3f,", sum2.rx, sum2.ry, sum2.rz)
    output += String(format: "%.3f,%.3f,%.3f,", sum3.x, sum3.y, sum3.z)
    output += String(format: "%.3f,%.3f,%.3f", sum3.rx, sum3.ry, sum3.rz)

    return output
于 2015-04-28T12:06:58.087 回答
3

我花了 4 个小时来找出我的项目长期编译中的问题。第一次尝试编译需要 42 分钟。

/Users/myname/Library/Developer/Xcode/DerivedData/ModuleCache/重新启动后,我按照@LNI 的建议清除了所有缓存,SourceKitService并对代码应用了一些更改:

1) 到

    var initDictionary:[String:AnyObject] = [
                    "details" : "",
                    "duration" : serviceDuration,
                    "name" : serviceName,
                    "price" : servicePrice,
                    "typeId" : typeID,
                    "typeName" : typeName,
                    "url" : "",
                    "serviceId" : serviceID,
                    "imageName" : ""
                ]

    var initDictionary= [
                    "details" : "",
                    "duration" : serviceDuration,
                    "name" : serviceName,
                    "price" : servicePrice,
                    "typeId" : typeID,
                    "typeName" : typeName,
                    "url" : "",
                    "serviceId" : serviceID,
                    "imageName: "" ]

2) 到

            if let elem = obj.property,
                let elem2 = obj.prop2,
                etc
                 {
                 // do stuf here
            }

           let value1 = obj.property ?? defaultValue

3)

           let serviceImages = images.filter { $0.serviceId == service.id }
           let sorted = serviceImages.sort { $0.sort > $1.sort }

            let serviceImages = images.filter { $0.serviceId == service.id }. sort { $0.sort > $1.sort }

结果编译时间 - 3 分钟,不是那么快,但更好的是 42 分钟。

结果,之前SourceKitService- 占用〜5,2Gb的内存和〜0.37Gb之后

在此处输入图像描述

于 2016-11-22T09:43:32.853 回答
3

我对 SourceKitService 有同样的问题。

我解决了。永远不要使用 for 循环添加子视图。

要检测我使用的问题: https ://github.com/RobertGummesson/BuildTimeAnalyzer-for-Xcode

于 2017-04-12T04:42:43.007 回答
3

XCode 10.0 中仍然存在该问题。您可以通过禁用源代码管理选项中的“显示源代码管理更改”来修复它。

在此处输入图像描述

于 2018-10-30T10:06:46.033 回答
2

对我来说,它可以删除派生数据。从菜单中选择“产品”并按住 Alt 键并选择“清理构建文件夹”。快捷键:Alt + Shift + Command + K

于 2015-05-19T13:39:10.767 回答
2
  1. 退出 Xcode
  2. 在终端中运行:

rm -rf ~/Library/Developer/Xcode/DerivedData/ModuleCache/*


请注意 LNI 接受的答案和这个答案之间的区别:

  1. 不崩溃总是比崩溃好。特别是在涉及 Xcode 进程/组件时。
  2. 我不是 Apple 开发人员,但部分删除缓存可能会破坏其完整性。清理所有缓存后,我没有注意到任何明显的延迟。
于 2016-10-12T09:07:56.880 回答
2

不要在没有指定数据类型或 [String:Any] 的情况下快速创建字典

如果我们使用 'Any' 类型,编译器可能会陷入无限循环以检查数据类型。

它不会产生任何编译错误,它会使我们的 mac 在“编译 swift 源文件”时冻结,并为名为“swift”和“SourceKitService”的任务获取大量内存。

于 2017-05-09T09:22:22.063 回答
2

我遇到了类似的组合多个??运算符为可选字符串值提供默认值。

当我值得信赖的 2010 年中期 MacBook Pro 上的风扇开始正常运行时,我正在试验下面的调试代码。SourceKitService 正在消耗它可以获得的每个 CPU 周期。评论和取消评论有问题的行非常清楚 SourceKitService 窒息的原因。它看起来像使用多个??操作员提供默认值是旧机器上的一个问题。解决方法就是不要这样做。将其分解为多个分配,这使得一些丑陋的调试代码更加丑陋。

placeMark 是 CLPlacemark 的一个实例。此处使用的属性返回可选字符串。

我使用的是在 OS 10.12.4 (16E195) 上运行的 Xcode 版本 8.3.2 (8E2002)

// one term is not an issue
let debugString1 = (placeMark.locality ?? "")

// two terms pushes SourceKitService CPU use to 107% for about 60 seconds then settles to 0%
let debugString1 = (placeMark.locality ?? "")  + ", " +  (placeMark.administrativeArea ?? "") 

// three terms pushes SourceKitService CPU use to 187% indefinitely 
let debugString1 = (placeMark.locality ?? "")  + ", " +  (placeMark.administrativeArea ?? "")  + (placeMark.postalCode ?? "")

// ugly but it's safe to use
var debugString1 = placeMark.locality ?? ""
debugString1 = debugString1 + ", " +  (placeMark.administrativeArea ?? "")
debugString1 = debugString1 + " " + (placeMark.postalCode ?? "")
于 2017-05-11T18:18:53.740 回答
2

将长数组转换为函数似乎可以解决我的问题:

var color: [UIColor] {
    return [
        UIColor(...),
        UIColor(...),
        ...
    ]
}

到:

func color() -> [UIColor] {
    return [
        UIColor(...),
        UIColor(...),
        ...
    ]
}
于 2017-05-24T06:19:39.580 回答
2

我遇到过这样的问题。源工具包服务使用了 10 GB 的使用量。活动监视器中的 Swift 进程使用量超过 6 GB。我正在使用以下代码:

变量详细信息:[字符串:任意] = [“1”:1,“2”:2,“3”:3,“4”:4,“5”:5,“6”:6,“7”: 7,“8”:8,“9”:9,“10”:10,“11”:11,“12”:12,“13”:13,“14”:14,“15”:15, “16”:16]

我已将代码更改为以下以解决此问题:

变量详细信息:[字符串:任何] = [:]

详细信息[“1”] = 1

详细信息[“2”] = 2

详细信息[“3”] = 3

细节[“4”] = 4

详细信息[“5”] = 5

详细信息[“6”] = 6

详细信息[“7”] = 7

详细信息[“8”] = 8

详细信息[“9”] = 9

详细信息[“10”] = 10

详细信息[“11”] = 11

详细信息[“12”] = 12

详细信息[“13”] = 13

详细信息[“14”] = 14

详细信息[“15”] = 15

详细信息[“16”] = 16

于 2017-06-14T12:41:03.247 回答
2

我一直在使用Xcode 9遇到这个问题,并探索了几种解决方案。对我来说,禁用源代码管理似乎可以解决问题。

Xcode -> Preferences -> Source Control -> uncheck "Enable Source Control"

如果这不起作用,我建议在终端使用renice命令。更多关于这里

禁用源代码管理

我尝试过的其他步骤,但没有帮助:

  1. 关闭 Xcode -> 删除派生数据
  2. 自行车机
  3. “清洁”项目
于 2017-10-18T06:06:29.893 回答
2

https://www.logcg.com/en/archives/2209.html

SourceKitService 负责 Swift 的类型推断工作。

private lazy var emojiFace = ["?", "?", "?", "?"]

更改为显式类型

private lazy var emojiFace:[String] = ["?", "?", "?", "?"]

SourceKitService CPU 使用率立即下降。</p>

于 2018-11-28T07:01:58.440 回答
1

面临同样的问题Xcode 7.2 (7C68)

解决方案是实现一个协议的方法,我的类在定义中有这个方法。

于 2015-12-26T21:32:58.537 回答
1

这仍然是 xcode 版本 7.3.1 (7D1014) 中的一个问题,就像 LNI 指出的那样,对我来说,这是一个太长的数组,实际上并没有那么长。我通过将数组分解成各种数组来解决我的问题,如下所示:

let firstLevel = [
            [1, 0, 1, 0, 1],
            [0, 0, 0, 0, 0],
            [1, 0, 1, 0, 1],
            [0, 0, 0, 0, 0],
            [1, 0, 1, 0, 1],
            [0, 0, 0, 0, 0]
        ]
        let secondLevel = [
            [0, 0, 0, 0, 0],
            [0, 1, 0, 1, 0],
            [0, 0, 0, 0, 0],
            [0, 1, 0, 1, 0],
            [0, 0, 0, 0, 0],
            [0, 0, 0, 0, 0]
        ]
        let thirdLevel =     [
            [0, 0, 0, 0, 0],
            [0, 0, 0, 0, 0],
            [0, 0, 1, 0, 0],
            [0, 0, 0, 0, 0],
            [0, 0, 0, 0, 0],
            [0, 0, 0, 0, 0]
        ]
        let map = [firstLevel, secondLevel, thirdLevel]
于 2016-08-23T20:10:45.483 回答
1

我对 XCode 8.2.1 (8C1002) 和以下代码有同样的问题:

import UIKit
import AVFoundation
import Photos
import CoreMotion
import Foundation


class TestViewController: UIViewController
{
    let movieFileOutput = AVCaptureMovieFileOutput()


var anz_total_frames = 0, anz_total_miss = 0

@IBOutlet weak var tfStatistics: UITextView!


func showVideoStatistics()
{
    let statisticText:String =             "frames: \(self.anz_total_frames)" + String.newLine +

        "frames/s: \(self.anz_total_frames / self.movieFileOutput.recordedDuration.seconds)" + String.newLine +

        "miss: " + formatText4FramesPercent(self.anz_total_miss) + String.newLine +
    "nicht erkannt: " + formatText4FramesPercent(self.anz_total_miss) + String.newLine +
        "nicht erkannt: " + formatText4FramesPercent(self.anz_total_miss) + String.newLine +
        "nicht erkannt: " + formatText4FramesPercent(self.anz_total_miss) + String.newLine +
        "nicht erkannt: " + formatText4FramesPercent(self.anz_total_miss) + String.newLine +
        "nicht erkannt: " + formatText4FramesPercent(self.anz_total_miss) + String.newLine +
        "nicht erkannt: " + formatText4FramesPercent(self.anz_total_miss) + String.newLine +
        "nicht erkannt: " + formatText4FramesPercent(self.anz_total_miss) + String.newLine +
        "nicht erkannt: " + formatText4FramesPercent(self.anz_total_miss) + String.newLine +
        "nicht erkannt: " + formatText4FramesPercent(self.anz_total_miss) + String.newLine +
        "nicht erkannt: " + formatText4FramesPercent(self.anz_total_miss) + String.newLine


    self.tfStatistics.text = statisticText
}

func formatText4FramesPercent(_ anz:Int) -> String
    {
        let perc = Double(anz)*100.0/Double(anz_total_frames)
        return String(perc.format(".1") + "%")
    }
}

以及这些扩展:

extension String {
    var localized: String {
        return NSLocalizedString(self, tableName: nil, bundle: Bundle.main, value: "", comment: "")
    }

    static var newLine: String {
        return "\r\n"
    }
}

extension Int {
    func format(_ f: String) -> String {
        return String(format: "%\(f)d", self)
    }
}

extension Double {
    func format(_ f: String) -> String {
        return String(format: "%\(f)f", self)
    }
}

我通过在 TestViewController 中注释这一行来解决它:

        "frames/s: \(self.anz_total_frames / self.movieFileOutput.recordedDuration.seconds)" + String.newLine +

花了我一个多小时才找到它,我希望可以节省一些其他人的时间。我向 Apple 提交了错误报告,编号为 30103533

于 2017-01-19T21:44:02.180 回答
1

对于 Objective-C 项目:

我遇到了同样的问题,我们项目中的 Swift 代码为零,所以它不是类型推断检查器。

我在这里尝试了所有其他解决方案,但没有任何效果 - 最终为我修复的是在恢复模式下重新启动计算机并运行磁盘修复。我终于又可以安心工作了!

我猜它的发生是因为一些损坏的符号链接,可能指向彼此并使服务在无限循环中运行。

于 2017-02-14T12:58:43.683 回答
1

将项目迁移到 swift 3 后,我遇到了同样的问题,找出解决方案需要时间,因为创建的字典和数组没有数据类型。

于 2017-03-03T05:31:27.000 回答
1

当我不小心声明了一个从自身继承的类时,这种行为出现在我的项目中。Xcode 8.2.1,使用 Swift 3。

于 2017-03-09T13:56:26.660 回答
1

我也有这个问题,就我而言,我声明了一个像这样的大数组:

var myArray: [(String, Bool?)]?
myArray = [("someString", someBool),
("someString", someBool),
("someString", someBool),
("someString", someBool),
("someString", someBool)
.
.
("someString", someBool)]

我通过每行添加项目 1 而不是同时添加所有项目来解决问题:

var myArray = [(String, Bool?)]()
myArray.append(("someString", someBool))
myArray.append(("someString", someBool))
myArray.append(("someString", someBool))
myArray.append(("someString", someBool))
myArray.append(("someString", someBool))
.
.
.

这解决了问题。

于 2017-03-14T22:23:17.077 回答
1

我在 Xcode 8.2.1 中遇到了类似的问题 - 通过 /* */ 注释掉了 1,000 多行代码的一部分。注释掉该部分导致了问题,删除注释掉的代码修复了它。

于 2017-04-13T18:10:34.527 回答
1

在终端中运行:

killall Xcode
rm -rf ~/Library/Developer/Xcode/DerivedData/ModuleCache
open /Applications/Xcode.app

您还可以使用此别名创建终端命令:

echo alias xcodeFix='killall Xcode;rm -rf ~/Library/Developer/Xcode/DerivedData/ModuleCache;open /Applications/Xcode.app' >> ~/.profile
source ~/.profile

然后就跑

xcodeFix
于 2017-12-19T17:56:01.530 回答
1

在 SwiftUI @ViewBuilder 块内调用 @dynamicMemberLookup 下标时,在 XCode 11.4.1 上发生在我身上。

于 2020-04-21T20:30:10.900 回答
0

我有同样的问题,它是由编程错误引起的。

在我的例子中,我正在实现可比较和等价的协议,并且 lhs.param 和 rhs.param 与 lhs 和 rhs 类的参数不对应。

于 2020-05-13T10:06:38.603 回答