SourceKitService 是用來服務(wù)于解析 Swift 代碼格式的鹦肿,和 Swift 的代碼著色、類型自動(dòng)推斷等特性息息相關(guān)揽祥,如果我們?cè)诨顒?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è)很長(zhǎng)的數(shù)組時(shí),不要寫成以下這樣:
let array = ["": [""], "": [""], "": [""], "": [""], "": [""], "": [""] ... ]
而是要給一個(gè)明確的類型件蚕,幫助 Xcode 進(jìn)行推斷:
let array: [String: [String]] = ["": [""], "": [""], "": [""], "": [""], "": [""], "": [""] ... ]
道理是這么個(gè)道理孙技,但是我檢查了我的代碼之后,發(fā)現(xiàn)并沒有類似的寫法的數(shù)組排作,甚至連長(zhǎng)數(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ī)范問題啊~