前言
年前時(shí)候接手了一個(gè)五六年前的老項(xiàng)目,有一些問(wèn)題已經(jīng)解決了,之前在老版本的Xcode上面運(yùn)行也還能接手脆烟,一兩分鐘運(yùn)行起來(lái),現(xiàn)在切換到Xcode 15上面運(yùn)行房待,調(diào)試邢羔,每一次真的是要命,運(yùn)行5,6,7,8十來(lái)分鐘吴攒,巨慢张抄,警告六七萬(wàn)個(gè),內(nèi)存動(dòng)輒十幾二十幾G洼怔,Mac內(nèi)存經(jīng)常發(fā)出不足警告,高峰時(shí)三十多G左驾,實(shí)在是不能忍受镣隶,嚴(yán)重影響開(kāi)發(fā)效率,傷Mac诡右。
溫馨提示
如果著急不用看前面的解決歷程安岂,直接看最后的終極解決方案——Xcode 消除各種警告。
目前問(wèn)題現(xiàn)狀
很多這個(gè)警告:
Pointer is missing a nullability type specifier (_Nonnull, _Nullable, or _Null_unspecified)
因?yàn)檫@個(gè)項(xiàng)目里面引用的庫(kù)帆吻,太多域那,還有第三方的項(xiàng)目,亂七八糟猜煮,啥都有次员,導(dǎo)致現(xiàn)在越來(lái)越慢,重復(fù)的東西太多王带,還不能亂改淑蔚,牽一發(fā)而動(dòng)全身。
解決歷程
針對(duì)這個(gè)問(wèn)題愕撰,網(wǎng)上一通找刹衫,其實(shí)已經(jīng)多次試圖解決這個(gè)問(wèn)題,但始終沒(méi)有找到切實(shí)可行的方法搞挣,
網(wǎng)上大概的解決方法:
- 打開(kāi)File---workspace setting...---Build System:選擇Legacy Build System带迟。
老項(xiàng)目還是用老的編譯系統(tǒng)吧。
但是很可惜囱桨,新版本的Xcode已經(jīng)沒(méi)有這個(gè)選項(xiàng)了
- 還有說(shuō)是發(fā)現(xiàn)組件內(nèi)的所有文件在編譯的時(shí)分都會(huì)有幾個(gè)相似的正告仓犬。
這些正告來(lái)自同一個(gè)文件,通過(guò)pch文件引證蝇摸。
有正告的文件是是很早以前建立的婶肩,文件里邊沒(méi)有自動(dòng)生成NS_ASSUME_NONNULL_BEGIN文件內(nèi)大概有很多個(gè)正告办陷。在編譯文件的時(shí)分,這些警告都會(huì)去做緩存律歼、分析民镜。導(dǎo)致運(yùn)行起來(lái)十分卡頓。
給出的處理方法:
消除警告险毁,從頭編譯制圈,發(fā)現(xiàn)項(xiàng)目跑起來(lái)十分的酣暢!
如果是有其他第三方庫(kù)或許組件的警告畔况,能夠在Podfile中添加 :inhibit_warnings => true 來(lái)防止編譯的時(shí)分查看警告鲸鹦。這種方式也會(huì)加速編譯速度。
在Podfile文件里面都加了跷跪,重新pod install馋嗜,然并卵。
- 針對(duì)這個(gè)問(wèn)題:
Pointer is missing a nullability type specifier (_Nonnull, _Nullable, or _Null_unspecified)
在項(xiàng)目中的類(lèi)中基本上都加了:
NS_ASSUME_NONNULL_BEGIN
NS_ASSUME_NONNULL_END
也沒(méi)有什么用吵瞻,依舊還是很慢丸冕,
- 可能跟3這個(gè)有關(guān)系烹植,最近太忙铛漓,沒(méi)時(shí)間來(lái)搞這個(gè)拜效,等等再說(shuō)。
階段性小結(jié)——
以上這些方法都是然并卵卿泽,基本沒(méi)有任何效果莺债,目前還沒(méi)有解決我的問(wèn)題,發(fā)揮大家的力量签夭,有類(lèi)似解決的提供一下解決方法齐邦,不勝感激。
終極解決方案——Xcode 消除各種警告
簡(jiǎn)單粗暴覆致,直接消除警告侄旬,項(xiàng)目里面的警告是在是太多,一個(gè)一個(gè)的改煌妈,要改到天荒地老儡羔,要吐血。
首先點(diǎn)擊這個(gè)警告璧诵,右鍵->reveal in log就能看到警告的詳細(xì)描述汰蜘,就能看到[]里面的字符就是警告對(duì)應(yīng)的標(biāo)識(shí)符。
如果Reveal in Log不可點(diǎn)擊或者點(diǎn)擊無(wú)效之宿,可以重新編譯或者重啟下Xcode
比如 Implicit conversion loses integer precision: ‘NSInteger’ (aka ‘long’) to ‘int32_t’ (aka ‘int’) 警告 顯示的就是 -Wno-shorten-64-to-32族操。其中 -W是前綴,這個(gè)前綴表示的是 打開(kāi)這種類(lèi)型的警告 如果我們是要關(guān)閉某種類(lèi)型的警告的話, 要將 -W換成 -Wno- ,也就是 -Wno-shorten-64-to-32。
如果整個(gè)項(xiàng)目都不想顯示這個(gè)警告色难,就可以在Build Setting里加上這個(gè)標(biāo)示符泼舱,Build Setting里搜索Other Warning Flags里添加關(guān)閉警告的命令。
如果只是針對(duì)某個(gè)文件不想顯示這個(gè)警告枷莉,則可以Build Phases->Compile Sources下找到相應(yīng)的文件在Compiler Flags下面加上命令即可娇昙。如果只是針對(duì)一段代碼不顯示某個(gè)警告,可以加上如下代碼
#pragma clang diagnostic push
#pragma clang diagnostic ignored"-Wunused-variable"
//這里是會(huì)報(bào)警告的代碼
#pragma clang diagnostic pop
如果不想顯示通過(guò)cocoapod導(dǎo)入的第三方庫(kù)的警告笤妙,則可以直接在Podfile文件里加入inhibit_all_warnings!冒掌,加在platform下面就可以。
忽略警告類(lèi)型
-Wno-nullability-completeness
-Wno-shorten-64-to-32
-Wno-arc-performSelector-leaks
-Wno-deprecated
-Wno-nonnull
-Wno-undeclared-selector
-Wno-objc-property-synthesis
-Wno-deprecated-declarations
-Wno-deprecated-implementations
常見(jiàn)的警告類(lèi)型有:
1, 聲明變量未使用 "-Wunused-variable"
2, 方法定義未實(shí)現(xiàn) "-Wincomplete-implementation"
3, 未聲明的選擇器 "-Wundeclared-selector"
4, 參數(shù)格式不匹配 "-Wformat"
5, 廢棄掉的方法 "-Wdeprecated-declarations"
6, 不會(huì)執(zhí)行的代碼 "-Wunreachable-code"
7, 指針類(lèi)型不匹配 "-Wincompatible-pointer-types"
8, 沒(méi)有實(shí)現(xiàn)已聲明的方法 "-Wincomplete-implementation"
9, -沒(méi)有實(shí)現(xiàn)協(xié)議的方法" "-Wprotocol"
10, 尚未聲明的函數(shù)(通常指c函數(shù)) "-Wimplicit-function-declaration"
11, 使用performSelector可能會(huì)出現(xiàn)泄漏 "-Warc-performSelector-leaks"
12.[-Wimplicit-retain-self]
Block implicitly retains 'self'; explicitly mention 'self' to indicate this is intended behavior
13蹲盘、[-Wstrict-prototypes]
block 中的void
14股毫、-Warc-retain-cycles
capturing 'self' strongly in this block is likely to lead to a retain cycle
15、[-Wunreachable-code]
code will never be executed
添加完確實(shí)少了很多召衔,很有效果铃诬。
還有一萬(wàn)多個(gè):
添加完所有:
這個(gè)也是一把雙刃劍,添加上就沒(méi)有相關(guān)的警告了薄嫡,自己要多注意代碼規(guī)范了氧急。
自己慢慢探索吧!
Xcode 的內(nèi)存終于下來(lái)了毫深,終于解決了我的問(wèn)題,現(xiàn)在運(yùn)行十幾秒就運(yùn)行起來(lái)了毒姨,不考慮其它的問(wèn)題哑蔫,還是挺流暢的。