处理 SourceKitService 内存占用过高
SourceKitService 是用来服务于解析 Swift 代码格式的,和 Swift 的代码着色、类型自动推断等特性息息相关,假如我们在活动监视器中强制中止掉这个服务,那么会发现 Xcode 中 Swift 代码大部分都会变成白色,并代码提醒和类型推断都失效了。
但是在我今天写代码的时候发现,这个服务忽然占用了很高的 CPU 以及内存,曾一度达到 201% 和 5.7GB 的占用率,直接导致了无法编译、没有代码提醒等问题。
搜索了少量资料后,网络上给出了两个具体的方案,根据这篇问题:https://stackoverflow.com/questions/26151954/sourcekitservice-consumes-cpu-and-grinds-xcode-to-a-halt
答复中指出了,首先可以尝试删除这个服务产生的缓存,而后手动终止掉这个服务,等待 Xcode 重新开启,可能会处理。
第二个办法就是,由于这个服务的天生缺陷,在进行复杂的字面量类型推断时,可能会造成占用大量资源,具体一点讲就是在写一个很长的数组时,不要写成以下这样:
let array = ["": [""], "": [""], "": [""], "": [""], "": [""], "": [""] ... ]而是要给一个明确的类型,帮助 Xcode 进行推断:
let array: [String: [String]] = ["": [""], "": [""], "": [""], "": [""], "": [""], "": [""] ... ]道理是这么个道理,但是我检查了我的代码之后,发现并没有相似的写法的数组,甚至连长数组都没有,就算给所有数组都手动加上类型,也无济于事。
后来发现,不光是数组,普通的变量频繁的进行“串联推断”也会导致这个问题,具体例子如下:
let userToken = (dataModel?.id ?? "") + (dataModel?.token ?? "") + (dataModel?.timestamp ?? "") + ...这种写法同样会添加自动类型推断的负担,偶尔甚至会造成代码不能通过编译阶段。
所以,我改成了这种写法:
let userID = dataModel?.id ?? ""let token = dataModel?.token ?? ""let timestamp = dataModel?.timestamp ?? ""...let userToken = userID + token + timestamp + ...经过改动之后,一切回归正常。
明明是想偷个懒,不想多写那么多属性,结果反而造成了雪崩式的麻烦,Xcode 瞬间变成了全球最大的 TXT 编辑器,看来以后还是要多注意一下规范问题啊~
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是摆设,本站源码仅提供给会员学习使用!
7. 如遇到加密压缩包,请使用360解压,如遇到无法解压的请联系管理员
开心源码网 » 处理 SourceKitService 内存占用过高