美文网首页
Category方法重名的检测方法

Category方法重名的检测方法

作者: 我唔知啊 | 来源:发表于2020-06-12 15:22 被阅读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 组件化中的应用与管控

    相关文章

      网友评论

          本文标题:Category方法重名的检测方法

          本文链接:https://www.haomeiwen.com/subject/lragtktx.html