SourceKitService 是用來服務(wù)于解析 Swift 代碼格式的,和 Swift 的代碼著色、類型自動(dòng)推斷等特性息息相關(guān),如果我們在活動(dòng)監(jiān)視器中強(qiáng)制停止掉這個(gè)服務(wù),那么會(huì)發(fā)現(xiàn) Xcode 中 Swift 代碼大部分都會(huì)變成白色,并代碼提示和類型推斷都失效了。
但是在我今天寫代碼的時(shí)候發(fā)現(xiàn),這個(gè)服務(wù)突然占用了很高的 CPU 以及內(nèi)存,曾一度達(dá)到 201% 和 5.7GB 的占用率,直接導(dǎo)致了無法編譯、沒有代碼提示等問題。
搜索了一些資料后,網(wǎng)絡(luò)上給出了兩個(gè)具體的方案,根據(jù)這篇問題:https://stackoverflow.com/questions/26151954/sourcekitservice-consumes-cpu-and-grinds-xcode-to-a-halt
回答中指出了,首先可以嘗試刪除這個(gè)服務(wù)產(chǎn)生的緩存,然后手動(dòng)終止掉這個(gè)服務(wù),等待 Xcode 重新開啟,可能會(huì)解決。
第二個(gè)辦法就是,因?yàn)檫@個(gè)服務(wù)的天生缺陷,在進(jìn)行復(fù)雜的字面量類型推斷時(shí),可能會(huì)造成占用大量資源,具體一點(diǎn)講就是在寫一個(gè)很長的數(shù)組時(shí),不要寫成以下這樣:
let array = ["": [""], "": [""], "": [""], "": [""], "": [""], "": [""] ... ]
而是要給一個(gè)明確的類型,幫助 Xcode 進(jìn)行推斷:
let array: [String: [String]] = ["": [""], "": [""], "": [""], "": [""], "": [""], "": [""] ... ]
道理是這么個(gè)道理,但是我檢查了我的代碼之后,發(fā)現(xiàn)并沒有類似的寫法的數(shù)組,甚至連長數(shù)組都沒有,就算給所有數(shù)組都手動(dòng)加上類型,也無濟(jì)于事。
后來發(fā)現(xiàn),不光是數(shù)組,普通的變量頻繁的進(jìn)行“串聯(lián)推斷”也會(huì)導(dǎo)致這個(gè)問題,具體例子如下:
let userToken = (dataModel?.id ?? "") + (dataModel?.token ?? "") + (dataModel?.timestamp ?? "") + ...
這種寫法同樣會(huì)增加自動(dòng)類型推斷的負(fù)擔(dān),偶爾甚至?xí)斐纱a不能通過編譯階段。
所以,我改成了這種寫法:
let userID = dataModel?.id ?? ""
let token = dataModel?.token ?? ""
let timestamp = dataModel?.timestamp ?? ""
...
let userToken = userID + token + timestamp + ...
經(jīng)過改動(dòng)之后,一切回歸正常。
明明是想偷個(gè)懶,不想多寫那么多屬性,結(jié)果反而造成了雪崩式的麻煩,Xcode 瞬間變成了全球最大的 TXT 編輯器,看來以后還是要多注意一下規(guī)范問題啊~