Category方法重名的检测方法

2020-06-12  本文已影响0人  我唔知啊

第一步:生成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));
        }
    }
}

参考:Category 特性在 iOS 组件化中的应用与管控

上一篇下一篇

猜你喜欢

热点阅读