清理iOS Mac项目废弃代码与无用图片

关于清理项目资源图片

很长一段时间,我们所做的APP的包都很大,90多M,plus上也有过100多M,但是,现在的包就50+M,期间有三次比较大的瘦身工程,第一次,是刚换leader的时候,大约是16年中,第二次是16年末前后大约2个项目周期期间,第三次是17年中。

第一次瘦身

16年6月之后的两个项目周期,也就是刚开始处理项目,我们做的活儿并不多

  • 一是处理代码里打警告,这些警告包括:1-方法废弃警告;2 - 类型转换警告;3 - unsed警告等。
  • 二是删除一些重复图片,当时用的是PhotoSweepper,软件只能查出来重复的图片,但是删的时候还是要注意留谁,建议把不准的看下重复图片的像素。
注意处理警告的时候,有些类型转换或者present废弃的情况要自己查验,很有可能出bug的,要 处理好上下文!

这次瘦身让项目看得清爽了一点,毕竟少了几千的警告!!

第二次瘦身

因为我跟leader挨着,平时做的研究性(杂活儿)比较多,我不是处女座,但是我看不惯项目代码的凌乱,我们都知道一点,项目包再大,只要它能正常运行,就不会有人找你麻烦,但是如果你动了代码,出了问题,那么罪当然是你的了。我的leader不赞成我删代码,但是也没有阻止我!于是,我开始第一次删除代码(一些陈旧废弃的代码,但是写这个的人早就离职了,管这个的产品可能也离职了,我遇到过最恐怖的情况,开发,产品,测试,后端懂这块逻辑的都离职了···)。
16年末是我刚接手项目(姑且叫A)里一整个模块的时候,姑且叫模块B,项目B之余A可以说是完全独立的,当在登录的时候,会根据账号权限,如果有B的权限,会提示去A还是B。项目B的代码是14年那种很古老的代码... 我这次主要删的是B里那期提了需求的代码,我会去梳理逻辑,进而会发现无用的类。下面说下我的经验:

  • 我们可以在项目里加个类目,这样可以在点击到哪个页面就打印当前是哪个类,当然我们得有足够进入所有页面的账号,可以问产品问测试~~当然你也可以自己捋。
#import "UIViewController+Tracking.h"
#import <objc/runtime.h>

@implementation UIViewController (Tracking)


+ (void)load {
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        Class class = [self class];
        swizzMethod(class, @selector(viewWillAppear:), @selector(fang_viewWillAppear:));
        swizzMethod(class, @selector(viewDidAppear:), @selector(fang_viewDidAppear:));
    });
}

static void swizzMethod(Class class, SEL originalSelector, SEL swizzledSelector) {
    Method originalMethod = class_getInstanceMethod(class, originalSelector);
    Method swizzledMethod = class_getInstanceMethod(class, swizzledSelector);
    
    BOOL didAddMethod =
    class_addMethod(class,
                    originalSelector,
                    method_getImplementation(swizzledMethod),
                    method_getTypeEncoding(swizzledMethod));
    
    if (didAddMethod) {
        class_replaceMethod(class,
                            swizzledSelector,
                            method_getImplementation(originalMethod),
                            method_getTypeEncoding(originalMethod));
    } else {
        method_exchangeImplementations(originalMethod, swizzledMethod);
    }
}


#pragma mark - Method Swizzling

- (void)fang_viewWillAppear:(BOOL)animated {
    [self fang_viewWillAppear:animated];
//    NSLog(@"viewWillAppear:%@", self);
}

- (void)fang_viewDidAppear:(BOOL)animated {
    [self fang_viewDidAppear:animated];
//    NSLog(@"[viewDidAppear]:%@", self);
    
    BOOL exclude = YES;
    for (NSString *classString in [self excludeArray]) {
        if ([self isKindOfClass:NSClassFromString(classString)]) {
            exclude = NO;
            break;
        }
    }
    if (exclude) {
        NSLog(@"[搜房帮]:%@", [self class]);
    }
}

- (NSArray *)excludeArray {
    
    NSArray *array = @[@"UINavigationController",
                       @"UIAlertController",
                       @"FangPageViewController",
                       @"UIInputWindowController",
                       @"UICompatibilityInputViewController",
                       @"UIPageViewController"];
    return array;
}
@end

如上,当我们要重构这个页面的时候,跟这个页面有关的,controller,cell,model,viewmodel就都可以删了,甚至没用的图片
*人有多大胆,地有多大产,哪怕是个小需求,更改一点东西,你也可以把整块删了,自己写,反正测试会测的,以后你是想继续糊窗户纸还是住小洋房就看你懒不懒了。
*假如我们这个类是不用的,我们可以先注释掉这个类,command+b,那么接下来你要处理的就是一层层的警告,先把别的类引用的这个不用类的import注释掉,处理完这层警告后,可以继续删除和他相关的cell什么的,同样是先注释再编译,再删除。总结下来就是
*注释本类(C)---->注释引用C的头文件---->删除只与C有关的类---->删除C---->全局搜索引用C的类---->确认是否有用,没有按上循环,有用删除对C的引用

第三次瘦身

这次瘦身小了大约20M的包大小,这次跟第二次的方法基本一样,有一点不同是,这次是删页面,比如,我们要删“我的”这个页面,要知道这个页面有很多cell,点击cell进去又是很多cell,这时候我们要做的是从最里面的页面往外删除,按上边的方法,切不可急躁。
这次删除遇到个问题就是,有些类本身就是废弃在项目里的,所以根本就没引用!!我们知道我们删除代码的时候有1-move to trash 2- move reference,当时打“前辈”估计就是选了2。。。他是多爱你···给你挖的坑!好在我们的项目模块是分文件夹的,日积月累,尽管不那么整洁,但是还是能知道这个类是不是可以删了,所以两点建议:

  • 一是项目模块分好文件夹
  • 二是项目类名要驼峰按模块从大到小命名

这次瘦身还涉及到了一些非页面类模块,比如网络配置类,通知类,这每个公司都不太一样,我们的老前辈,是在项目里建了个通知中心,每个接口对应不通的通知名,这时候,要清理就比较麻烦了,项目越大越麻烦,如果你们项目分模块,那么恭喜了~如果没分,你就慢慢删吧,从整理页面通知开始。如果分模块了,你就可以整个模块注释,慢慢捋。

项目里还有一些重复的单例类,虽然这种情况不该发生,但是确实有很多类似的工具类,后人不知道前辈已经写好了,或者前辈写的不通用!好吧,我自己写一个,那我也写一个···你懂的~~ 你可以把所有的头文件都合并到另一个去,@implementation也如是,这时候优先对待红色警告,其次是黄色,类似的合并,command + B,改项目里的被你刚刚删除的那个方法!一个个改就好了~~

删除资源图片

链接:https://github.com/tinymind/LSUnusedResources
这个工具可以检测出项目里很大一部分没用的图片或者重复的图片,但是有bug

  • 会闪退,大家可以自己改改里面的代码,我们用的时候修改过一次,闪退很少
  • 检测出的有可能是有用的图片,我遇到的一种情况是动态图片名字,比如图片有normal(used_n_%@),high(used_h_%@...),诸如这种类似的命名,就可能造成还在用而被你删除的问题。

使用

LSUnusedResourcesExample.gif

除了上边的建议另外有几点:

  • 建议所有的资源图片都放到一个文件夹,分模块放在子文件夹
  • 图片要让设计(美工)上点心,别要一个给一个,很多都重复了,要不开发建个管理系统,要不测试弄一个,这个好很多
  • 建议按view,model,viewmodel viewcontroller,vendor,framework等分好文件夹等
  • 本来就是精简代码,我却BB了这么多,就是告诉大家,瘦身挺麻烦的,熟能生巧,胆子要大!!!
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 161,780评论 4 369
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 68,424评论 1 305
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 111,397评论 0 254
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,576评论 0 218
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,997评论 3 295
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,945评论 1 224
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,107评论 2 317
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,850评论 0 208
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,625评论 1 250
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,804评论 2 253
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,285评论 1 265
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,613评论 3 261
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,291评论 3 242
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,164评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,963评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 36,096评论 2 285
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,886评论 2 278

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 170,594评论 25 707
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,108评论 18 139
  • Podfile.lock 文件最后一次更新Pods时,所有第三方框架的版本号 Pod常用指令区别:$ pod in...
    ShenYj阅读 6,575评论 1 18
  • 白兰在母亲去世后,孤身一人去韩国找姨妈,然而她姨妈全家移民加拿大,没有一个亲人的白兰选择留在韩国,但是签证到期后她...
    timdk阅读 1,016评论 0 0
  • ​ 本文共1700字,建议阅读5分钟 欢迎大家来到我们的“大咖谈考研”栏目,每周的周一至周五,我们会帮大家问至少5...
    9c10357f5f9e阅读 660评论 1 0