检测无用的方法

1.所有的方法

通过buildSetting->LinkMap设为yes且设map路径生成文件。

2.真正使用的方法:

通过otool反编译出selrefs段,如:otool -v -s __DATA __objc_selrefs /Users/a58/Library/Developer/Xcode/DerivedData/bangjob-gwroieegkblzmfbtvtdfeztswqdc/Build/Products/Debug-iphoneos/bangjob.app/bangjob >> bang_sel生成文件。执行文件路径指的是app包里的macho文件。

3.无用的方法 = 所有方法 - 真正的方法

所有代码如下:

/*
 *  所有方法-真正的方法=无用的方法
 */
- (void)testMinus {
    NSMutableSet *set1 = [self testFile];
    NSMutableSet *set2 = [self testOtoolBangFile];
    NSLog(@"所有方法count:%ld, 真正使用的方法count:%ld", set1.count, set2.count);
    NSLog(@"正在相减...");
    [set1 minusSet:set2];
    NSLog(@"无用方法的count:%ld, 包含set方法", set1.count);

    NSMutableSet *containSetterSet = [NSMutableSet set];
    for (NSString *sel in set1) {
        if([sel hasPrefix:@"set"]) {
            [containSetterSet addObject:sel];
        }
    }
    
    NSLog(@"去除set方法 %ld个", containSetterSet.count);
    [set1 minusSet:containSetterSet];
    
    NSLog(@"最终无用方法的count:%ld个", set1.count);
    [[set1 allObjects] writeToFile:@"/Users/a58/noUse-sel" atomically:YES];
    NSLog(@"还是不行,包含getter方法!平时直接用_变量并不调getter方法;并且包含第三方的无用方法");
}

/*
 *  真正使用的方法。
 *  通过命令otool -v -s __DATA __objc_selrefs /Users/a58/Library/Developer/Xcode/DerivedData/bangjob-gwroieegkblzmfbtvtdfeztswqdc/Build/Products/Debug-iphoneos/bangjob.app/bangjob >> bang_sel 生成文件
 */
- (NSMutableSet *)testOtoolBangFile {
    
    NSError *error;
    NSString *content = [NSString stringWithContentsOfFile:@"/Users/a58/bang_sel" encoding:NSASCIIStringEncoding error:&error];
    NSString *patternStr = [NSString stringWithFormat:@"__objc_methname:([0-9a-zA-Z_:]+)\\n"];
    NSRegularExpression *regularexpression = [[NSRegularExpression alloc]
                                              initWithPattern:patternStr
                                              options:NSRegularExpressionCaseInsensitive
                                              error:nil];
    
    NSArray<NSTextCheckingResult *> *matches = [regularexpression matchesInString:content options:NSMatchingReportProgress range:NSMakeRange(0, content.length)];
    
    NSLog(@"真正使用的方法:before - count:%ld", matches.count);
    NSMutableSet *set = [NSMutableSet set];
    for (NSTextCheckingResult *result in matches) {
        NSRange range2 = [result rangeAtIndex:1];
        NSString *method = [content substringWithRange:range2];
        [set addObject:method];
    }
    NSLog(@"真正使用的方法:after - count:%ld", set.count);
    return set;
}

/*
 * 所有的方法。
 * 通过buildSetting->LinkMap设为yes且设map路径生成文件
 */
- (NSMutableSet *)testFile {
    NSError *error;
    NSString *content = [NSString stringWithContentsOfFile:@"/Users/a58/linkMap.txt" encoding:NSASCIIStringEncoding error:&error];
//    NSString *patternStr = [NSString stringWithFormat:@"([+-]\\[.+\\s(.+)\\])"];
    NSString *patternStr = [NSString stringWithFormat:@"[+-]\\[[0-9a-zA-Z_]+\\s([0-9a-zA-Z_:]+)\\]\\n"];
    NSRegularExpression *regularexpression = [[NSRegularExpression alloc]
                                              initWithPattern:patternStr
                                              options:NSRegularExpressionCaseInsensitive
                                              error:nil];
    
    NSArray<NSTextCheckingResult *> *matches = [regularexpression matchesInString:content options:NSMatchingReportProgress range:NSMakeRange(0, content.length)];
    
    NSLog(@"所有方法:before - count:%ld", matches.count);
    NSLog(@"正在去重...");
    NSMutableSet *set = [NSMutableSet set];
    for (NSTextCheckingResult *result in matches) {
        NSRange range2 = [result rangeAtIndex:1];
        NSString *method = [content substringWithRange:range2];
        [set addObject:method];
    }
    NSLog(@"所有方法 after - count:%ld", set.count);
    [[set allObjects] writeToFile:@"/Users/a58/link-sel" atomically:YES];
    return set;
}

打印的日志如下:

2018-12-07 19:28:41.909175+0800 TestMachO2[80125:1791939] 所有方法:before - count:53987
2018-12-07 19:28:41.909410+0800 TestMachO2[80125:1791939] 正在去重...
2018-12-07 19:28:41.971372+0800 TestMachO2[80125:1791939] 所有方法 after - count:27194
2018-12-07 19:28:42.014835+0800 TestMachO2[80125:1791939] 真正使用的方法:before - count:23796
2018-12-07 19:28:42.042791+0800 TestMachO2[80125:1791939] 真正使用的方法:after - count:23796
2018-12-07 19:28:42.042883+0800 TestMachO2[80125:1791939] 所有方法count:27194, 真正使用的方法count:23796
2018-12-07 19:28:42.042911+0800 TestMachO2[80125:1791939] 正在相减...
2018-12-07 19:28:42.053201+0800 TestMachO2[80125:1791939] 无用方法的count:6709, 包含set方法
2018-12-07 19:28:42.055813+0800 TestMachO2[80125:1791939] 去除set方法 2633个
2018-12-07 19:28:42.057631+0800 TestMachO2[80125:1791939] 最终无用方法的count:4076个
2018-12-07 19:28:42.062334+0800 TestMachO2[80125:1791939] 还是不行,包含getter方法!平时直接用_变量并不调getter方法;并且包含第三方的无用方法

结论

最终找出无用的方法4076个。
但是getter方法和第三方的库的方法混在其中,无法剔除,只能通过人工一个一个查看来进行筛选。所以还需要尝试其它更好的方式!!!

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,723评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,003评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,512评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,825评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,874评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,841评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,812评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,582评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,033评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,309评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,450评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,158评论 5 341
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,789评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,409评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,609评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,440评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,357评论 2 352

推荐阅读更多精彩内容

  • Mach-O 概述 和 部分命令介绍 我们知道Windows下的文件都是PE文件,同样在OS X和iOS中可执行文...
    青花瓷的平方阅读 14,899评论 2 52
  • 命令汇总 file XXX查看macho文件架构信息和是否是动态库 从上面信息可以看出来,dyld是一个dynam...
    繁星mind阅读 2,834评论 5 3
  • 资源优化 1. 去除无用资源 一般都是版本迭代过程中存在的图片资源。可以借助三方工具来解决: Unused-mas...
    RobinZhao阅读 2,198评论 2 24
  • LinkMap诡探 Xcode中配置LinkMap LinkMap文件是Xcode产生可执行文件(Mach-O)的...
    coder_feng阅读 567评论 0 0
  • 熟悉Linux和windows开发的同学都知道,ELF是Linux下可执行文件的格式,PE32/PE32+是win...
    Klaus_J阅读 3,942评论 1 10