前言
在涉及到項(xiàng)目大改版,或者涉及到某個(gè)功能模塊大變更,就會(huì)涉及到圖片廢棄和文件廢棄的情況。
但是這時(shí)候就會(huì)遺留下一個(gè)很大的問(wèn)題,沒(méi)有將廢棄的、無(wú)用的文件類或資源刪除干凈。而這次需要對(duì)工程代碼的無(wú)用資源和無(wú)用文件進(jìn)行刪除處理,感觸頗多,故在此筆記。
首先,感覺(jué)很多人的代碼習(xí)慣還是惡待提高。比如我發(fā)現(xiàn)一些人的代碼操作習(xí)慣,從好到次,可以大略分以下情況。
編碼習(xí)慣問(wèn)題:
1、有良好的代碼習(xí)慣的程序猿就能夠在邊開發(fā)邊刪除那些無(wú)用的文件或資源,但是如果涉及面廣的資源,總會(huì)有些遺落的沒(méi)有處理掉。
2、那些代碼習(xí)慣比較一般的,有一部分只刪除沒(méi)有用的當(dāng)前類,就不去關(guān)注已經(jīng)他的子類,如其對(duì)應(yīng)的view類、model類,甚至對(duì)應(yīng)的圖標(biāo),也是留下了不少垃圾文件。
3、對(duì)一些代碼習(xí)慣不好的,有的只會(huì)注釋關(guān)鍵入口,不去了解對(duì)應(yīng)需求以后還用不用,其他一概不處理,美其名曰以后如果以后還有用的話,一句代碼還原回來(lái)就可以了,此為最次,不可原諒。
如何保持良好習(xí)慣:
在這里我已經(jīng)不想多說(shuō)了,我提到很多次了。上鏈接:
1、程序員的自我修養(yǎng):論代碼規(guī)范的重要性
2、如何讓自己的代碼更整潔
以上僅為個(gè)人認(rèn)知總結(jié),不是核心內(nèi)容。
好了,上干貨:
一、無(wú)效圖片資源檢測(cè)
1.1、LSUnusedResources
1.1.1、插件下載
LSUnusedResources,用【My Mac】模擬器運(yùn)行,如下圖:

1.1.2、檢測(cè)范圍
a、檢測(cè)不到的圖片
(1)xib, storyboard里面設(shè)置的圖片
(2)項(xiàng)目中使用@"image_%02d"代碼設(shè)置加載的圖片
(3)項(xiàng)目中宏定義使用到的圖片。
(4)圖片保存在本地,需要服務(wù)器返回字段名, 本地根據(jù)返回的字符串,記載圖片的。此最為奇葩,應(yīng)該是很老的代碼,或者有什么特殊要需求吧,建議能不用就不用。這是恨不規(guī)范的寫法(這種方式根本就是無(wú)跡可查,如果有用到,而且沒(méi)有記錄過(guò)有哪些,那么圖片資源文件的瘦身就結(jié)束了吧)。
1.1.3、檢測(cè)結(jié)果處理
通過(guò)檢測(cè)工具發(fā)現(xiàn)了無(wú)用的圖片,請(qǐng)不要點(diǎn)擊該工具的刪除按鈕,這是不可恢復(fù)的,垃圾簍里也不會(huì)出現(xiàn)已刪除的圖片。要?jiǎng)h除圖片的話還是到項(xiàng)目中搜索這些檢測(cè)出來(lái)的圖片進(jìn)行排查,不屬于第1、第2點(diǎn)情況后,在進(jìn)行手動(dòng)刪除。
1.1.4、奇淫巧技
1、第一次檢索時(shí),先打鉤忽略最后帶數(shù)字的圖片,即上面的圖片步驟2。
2、待圖片處理完一遍之后,再把打鉤去掉檢索。
這樣檢索出來(lái)的結(jié)果就不會(huì)那么雜。
二、無(wú)效文件檢測(cè)
這里有兩個(gè)插件,各有千秋,但是兩個(gè)都需要用到。先上干貨,后面再進(jìn)行比對(duì)。
2.1、XcodeProjectArrangementTool
2.1.1、插件下載
XcodeProjectArrangementTool,用【My Mac】模擬器運(yùn)行,如下圖:

2.1.2、檢測(cè)范圍說(shuō)明
a、檢測(cè)不涉及范圍:
(1)資源類文件不檢測(cè)
b、檢測(cè)到確實(shí)是沒(méi)有用到的情況
(1)文件存在,有關(guān)聯(lián)到項(xiàng)目的,且該項(xiàng)目也沒(méi)有被引用到的。
c、檢測(cè)到顯示沒(méi)用的,但實(shí)際是有用的
(1)單元測(cè)試的文件
(2)只通過(guò)+load方法實(shí)現(xiàn)業(yè)務(wù)邏輯的(因?yàn)椴恍枰募?dǎo)入)
(3)接口c++語(yǔ)言實(shí)現(xiàn),外部調(diào)用不需要導(dǎo)入該文件的
2.1.3、檢測(cè)結(jié)果處理
對(duì)檢測(cè)到的unused文件,還是需要一個(gè)個(gè)去排查,要根據(jù)項(xiàng)目實(shí)際情況處理,不知道的最好和小伙伴之間多溝通,總是沒(méi)有壞處的
2.2、WHC_ScanUnusedClass
2.2.1、插件下載
WHC_ScanUnusedClass,用【My Mac】模擬器運(yùn)行,如下圖:

功能點(diǎn)說(shuō)明:
掃描速度:快速掃描 > 常規(guī)掃描 > 深度掃描
掃描準(zhǔn)確性:快速掃描 < 常規(guī)掃描 < 深度掃描
快速掃描: 主要針對(duì)高編碼質(zhì)量項(xiàng)目(命名規(guī)范,無(wú)垃圾注釋…),掃描速度最快
常規(guī)掃描: 主要針對(duì)一般編碼質(zhì)量項(xiàng)目(命名規(guī)范一般,少量垃圾注釋…),掃描速度一般
深度掃描: 主要針對(duì)編碼質(zhì)量比較差的項(xiàng)目(命名不規(guī)范,大量垃圾注釋…),掃描速度比較慢
設(shè)置掃描線程的數(shù)量不宜過(guò)大一般5個(gè)線程左右足以(設(shè)置太大內(nèi)存承受壓力大)
2.2.2、檢測(cè)范圍
a、檢測(cè)不涉及范圍:
(1)單元測(cè)試文件不檢測(cè)。
(2)資源類文件不檢測(cè)
b、檢測(cè)到確實(shí)是沒(méi)有用到的情況
(1)文件存在但沒(méi)有關(guān)聯(lián)到項(xiàng)目的。這種情況在項(xiàng)目里全局搜索是無(wú)法搜索到的,只能在項(xiàng)目目錄中找到,知道到可以將之刪除。
(2)文件存在并關(guān)聯(lián)到項(xiàng)目的。這個(gè)情況又分幾個(gè)小類:僅僅存在,文件不被引用的;文件有被引用過(guò),但是沒(méi)有被實(shí)現(xiàn)的,這類也不少。
c、檢測(cè)到顯示沒(méi)用的,但實(shí)際是有用的
(1)只通過(guò)+load方法實(shí)現(xiàn)業(yè)務(wù)邏輯的(因?yàn)椴恍枰募?dǎo)入)
(2)只在xxx.xib中使用的文件類
(3)只實(shí)現(xiàn)枚舉配置的文件類
(4)通過(guò)NSClassFromString(@“xxx”)獲取文件類的
(5)通過(guò)鍵值對(duì)建立關(guān)聯(lián)關(guān)系配置的,如下:
- (NSDictionary *)itemContentViewMapperWithScrollViewManager:(SZYEditorScrollViewManager *)scrollViewManager {
return @{
@"SZYEditorScrollViewItem":@"SZYEditorScrollContentView",
};
}
(6)請(qǐng)求響應(yīng)模型子模型,檢測(cè)不出來(lái)(這種最多),如下:
@interface ZTGPicParamEnvelop : SZYJsonModel
// 發(fā)布最多圖片數(shù)
@property (nonatomic, assign) NSInteger maxPicForRecipes;
// 最多推薦選中圖片數(shù)
@property (nonatomic, assign) NSInteger maxRecommendSelectPhotoCount;
@end
@interface ZTGResponseTeacherBaseConfigEnvelop : SZYJsonModel
@property (nonatomic, strong) ZTGPicParamEnvelop *picParam;
@end
2.2.3、檢測(cè)結(jié)果處理
對(duì)檢測(cè)到的unused文件,還是需要一個(gè)個(gè)去排查。項(xiàng)目越大,出現(xiàn)的檢測(cè)沒(méi)有用,但實(shí)際有應(yīng)用的還是不少的,所以還需要特別注意。
三、兩個(gè)檢索文件的插件比對(duì)與應(yīng)用
通過(guò)以上的說(shuō)明可以,處理檢索范圍不一致,其他的基本一致。但正是因?yàn)闄z索范圍不一致,直接導(dǎo)致了兩個(gè)插件之間檢索效率的極大差異。
差異:
1、插件XcodeProjectArrangementTool檢索比較簡(jiǎn)單,一個(gè)大項(xiàng)目檢索下來(lái)也就幾分鐘搞定,而插件WHC_ScanUnusedClass,一個(gè)大項(xiàng)目檢索下來(lái)要幾個(gè)小時(shí)(我的項(xiàng)目花了十個(gè)小時(shí)左右)。
2、兩個(gè)插件都存在在檢索的時(shí)候,不能對(duì)項(xiàng)目操作處理,不然都會(huì)出現(xiàn)奔潰的情況。
應(yīng)用:
1、根據(jù)以上兩個(gè)差異,我們可以先使用插件XcodeProjectArrangementTool初步檢索,將無(wú)用的文件刪除。由于在刪除的時(shí)候,會(huì)出現(xiàn)其導(dǎo)入文件子類無(wú)用并且沒(méi)有刪除干凈,那么,建議要多關(guān)注我們要?jiǎng)h除文件,其引用的文件,查看是否可以一并刪除。項(xiàng)目比較大的情況下,建議最少重復(fù)執(zhí)行三遍,才能將項(xiàng)目中無(wú)用的文件刪除的相對(duì)干凈。
2、然后再使用插件WHC_ScanUnusedClass進(jìn)行深度掃描查詢(一個(gè)大的項(xiàng)目,10多年的代碼,我才不相信所有的代碼都能按實(shí)現(xiàn),所以老實(shí)點(diǎn)吧,就選深度掃描,既然都是慢的了,再慢一點(diǎn)又如何)。然后把檢索出來(lái)的認(rèn)為貌似沒(méi)有用的,全部查看一遍,再做刪除與否處理。執(zhí)行三遍,還是一樣的邏輯。
3、也是最后一點(diǎn),無(wú)用資源文件刪除,這個(gè)檢索還是很快的。但是為什么放在最后呢?因?yàn)橹挥邪褵o(wú)用文件刪除干凈了,這時(shí)候差不多也把其中引用的資源文件也刪除了一遍。這樣的話,可以避免出現(xiàn)無(wú)用功。
原文鏈接:https://blog.csdn.net/weixin_38633659/article/details/119993469