Xcode Beta经常挂起/ SourceKitService占用高CPU

7
在我的一些新项目中,我遇到了问题,Xcode Beta5(我以前的测试版也有这个问题)经常会卡住('beachball')。在活动监视器中,我可以看到SourceKitService需要100%的CPU。
然后Xcode至少会挂起10-15秒钟。
我不知道这是否是我的代码问题。在控制台实用程序中,我可以看到很多这样的错误:
sourcekit-serv[63558]: [1:getBufferStamp:17199:1776.3650] failed to stat file: <imports> (No such file or directory)
更新:
我发现以下内容是问题所在:[[String: AnyObject]],就像:
var myArray: [[String: AnyObject]]
myArray = [
    ["name": "item1", "children": [
        "name": "child1", "children": [],
        "name": "child2", "children": []]],
    ["name": "item2", "children": [
        "name": "child1", "children": [],
        "name": "child2", "children": []]]  
]

但是需要注意的是:这段代码会在几秒钟后完全阻塞Xcode!


2
听起来像是beta版中的一个错误。请向Apple提交错误报告。确保在应用程序旋转时从活动监视器中采样并附上样本。您也可以在Apple开发人员论坛上开始一个主题以查看苹果开发人员是否有任何建议。 - BergQuester
我也认为这是一个 bug,但我经常发现代码中的某些问题会导致 Source Kit Service 出错 - 因此最好仔细检查一切。 - James Alvarez
1
我遇到了同样的问题。即使是system.log也会出现错误:sourcekit-serv[90283]: [1:getBufferStamp:7735:72.0411] failed to stat file: <imports> (No such file or directory) 我还没有找出是哪个文件/代码块/行/导入等引起了这个问题。 - Klaas
2个回答

10

经过一段时间的努力和阅读许多遇到同样问题的人的帖子后,我意识到这个问题的共性是:Swift 难以处理“复杂”的数组和字典。为了帮助 Xcode,我明确地定义了所有数组和字典变量的类型,而不是让 Xcode 自己去推断。这使我的问题得以解决。

不要再使用以下代码让 Swift 推断变量类型:

var myDictionary1 = ["Item":[1,2,3],"Thing":[4,5,6],"Weight":[7,8,9]]

我将我的变量声明重写为以下形式:

var myDictionary2: [String:[Int]] = ["Item":[1,2,3],"Thing":[4,5,6],"Weight":[7,8,9]]

顺便提一句,Xcode的自动完成将myDictionary1显示为[String:ArrayInt],将myDictionary2显示为[String:[Int]]。


这只是我的情况!非常感谢。 - Ibolit
我认为这是正确的答案。清除DerivedData并没有帮助。在Xcode 7.1上仍然存在此问题。我发现字典不需要很复杂就可以发生这种情况。在这一点上,似乎最好总是声明键和值的类型,例如:var myDictionary: [String: AnyObject]。 - David Pettigrew

9

我发现当SourceKit出现问题时,我可以确认问题不是由我的代码引起的(导致编译器在后台崩溃),退出Xcode,删除~/Library/Developer/Xcode/DerivedData/ModuleCache以及该位置中用于我的应用程序的派生数据的文件夹通常可以(至少暂时)解决问题。


4
我尝试过这个方法,但完全没有效果。下次打开 Xcode 时问题仍然存在。这似乎与某些情况下未初始化变量有关。 - E.Freitas
我几乎总是可以通过添加一行包含许多变量的代码来得到这样的错误,就像这样:'if ((bax * bcy * bdz + bay * bcz * bdx + baz * bcx * bdy - baz * bcy * bdx - bay * bcx * bdz - bax * bcz * bdy) * (bpx * bcy * bdz + bpy * bcz * bdx + bpz * bcx * bdy - bpz * bcy * bdx - bpy * bcx * bdz - bpx * bcz * bdy) > 0.0)' - E.Freitas
我相信你可以做很多边缘情况的东西,让编译器出错,但我的代码非常模块化(我正在编写框架和使用它们的代码),因此我的崩溃和修复可能不适用于你的特定情况。 - Wolf McNally
当SourceKitService崩溃的控制台日志中包含"clang::CompilerInstance::loadModule"时,此方法似乎可以解决该问题。谢谢! - marcprux

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接