解決 SourceKitService 內(nèi)存占用過高

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ī)范問題啊~

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容