第一步:生成Link Map File
在Target-Build Settings搜索Link Map File
,设置Write Link Map File
的Debug的值为YES,设置Path to Link Map File
的Debug的值为/Users/gamesirdev/Desktop/LinkMap.txt
编译项目,拿到LinkMap.txt文件
第二步:筛选数据
category方法的表现形式:-[UIView(Extesion) wz_x]
,根据此形式筛选数据
// 截取「# Symbols:」到「Dead Stripped Symbols:」的所有行
// 「cut -f 3」:取第三列
// 「>> ./1.txt」:复制到1.txt文件
sed -n '/^# Symbols:/,/Dead Stripped Symbols:$/p' ./LinkMap.txt | grep -Ev '(^# Symbols: | # Dead Stripped Symbols:&)' | cut -f 3 >> ./1.txt
// 删除不包含(的行
sed -i '' '/(/!d' ./1.txt
// 删除行,这些行中不包含+-中的一个
sed -i '' '/[+-]/!d' ./1.txt
// 删除每一行的前6个字符
sed -i '' 's/.\{6\}//' ./1.txt
// 删除不包含[的行
sed -i '' '/\[/!d' ./1.txt
// 删除+号之前的所有内容(把+号及+号之前的所有内容替换为+号)
sed -i '' 's/.*+/+/' ./1.txt
// 删除-号之前的所有内容(把-号及-号之前的所有内容替换为-号)
sed -i '' 's/.*-/-/' ./1.txt
// 删除不包含(的行(一些特殊的行到此还没删除,因此再筛选一遍)
sed -i '' '/(/!d' ./1.txt
// 删除不包含[的行
sed -i '' '/\[/!d' ./1.txt
// 删除包含问号和双引号的行
sed -i '' '/[?"]/d' ./1.txt
// 删除括号及括号内的所有内容(把括号及括号里面的内容替换为空)
sed -i '' 's/[(][^)]*[)]//g' ./1.txt
第三步:遍历并计算重复方法的个数
- (void)testCategoryMethodNameClashes {
NSString *filePath = [[NSBundle mainBundle] pathForResource:@"1" ofType:@"txt"];
NSString *dataFile = [NSString stringWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:nil];
NSArray *datas = [dataFile componentsSeparatedByString:@"\n"];
NSMutableArray* tmpContainer = [NSMutableArray arrayWithCapacity:0];
NSMutableDictionary* repeatCounts = [[NSMutableDictionary alloc] init];
for (NSString* string in datas) {
if ([tmpContainer containsObject:string]) {
if (repeatCounts[string]) {
repeatCounts[string] = @([repeatCounts[string] integerValue] + 1);
}else {
repeatCounts[string] = @(1);
}
}else {
[tmpContainer addObject:string];
}
}
NSArray* allKeys = repeatCounts.allKeys;
for (NSString* key in allKeys) {
NSInteger count = [repeatCounts[key] integerValue];
if (count > 1) {
NSLog(@"=====类别方法%@ 重复%@次=====", key, @(count));
}
}
}