iOS开发实践:控制代码段大小

1.为什么要关注代码段大小?

因为苹果在审核的时候是会对你提交的工程的二进制文件中__TEXT段大小做限制。一般是比较大的项目中才需要注意这个问题,而我所在的项目恰好是一个有多年历史,而且功能巨多的项目。__TEXT段大小早已经触及苹果限制。所以每期开发工作不仅需要开发新需求,还需要对项目中的一些无用代码进行删除,给项目瘦身。

2.如何查看代码段大小分布情况?

要想给代码段瘦身,首先需要知道具体哪块代码占用了多少空间。Xcode编译产生的linkmap恰好可以告诉我们这些信息。做法如下:
a.打开编译器开关,使编译产生linkmap文件
Xcode->Build Settings->Write Link Map File->YES

image.png

b.DerivedData路径下找到linkmap文件
路径如下:

/Users/username/Library/Developer/Xcode/DerivedData/YourProduct-ewieucoyokvtgsbihwymmdqjccpy/Build/Intermediates.noindex/YourProduct.build/Debug-iphonesimulator/YourProduct.build/YourProduct-LinkMap-normal-x86_64.txt 

YourProduct-LinkMap-normal-x86_64.txt 也就是你的项目的linkmap文件。

c.分析linkmap文件
linkmap主要一下几个模块组成:

# Path
# Arch: x86_64
# Object files:
# Sections:
# Symbols:
# Dead Stripped Symbols:

我们主要关注的是Object files和Symbols两个部分
Object files中数据如下:

[ 12] /Users/jlstmac/Library/Developer/Xcode/DerivedData/YourProduct-ewieucoyokvtgsbihwymmdqjccpy/Build/Intermediates.noindex/YourProduct.build/Debug-iphonesimulator/YourProduct.build/Objects-normal/x86_64/AppDelegate.o

也就是:
[ 12]可以看作是id,后面的AppDelegate.o就是AppDelegate这个类编译后的文件。

Symbols中数据如下:

# Address   Size        File  Name
0x100020080 0x00000050  [ 12] -[AppDelegate(BackgroundLoadService) didEnterBackground]
0x100020800 0x00000170  [ 12] -[AppDelegate(BackgroundLoadService) willEnterForeground]

Address为偏移量,size为这个方法的大小(十六进制),File为对应的id也就是Object files中的[ 12],把所有[ 12]的大小相加就是AppDelegate这个类编译后的大小。
这里可以通过脚本的方式统计各个类的大小,便于在代码瘦身的时候有所参考。

3.如何减小代码段大小

方法很多,这里例举一下我的项目中实际用到的做法。

a.尽量少的使用block,去掉Masonry代码
我们都知道block其实由c实现的匿名函数,虽然block很好用,但是它会急剧扩张代码段大小。原因是,由于block的特性,系统实现block的时候会拷贝帮我们实现拷贝功能,展开之后会生成很多代码。
介于block用处实在太大,彻底杜绝使用block不太现实,我们项目中的原则是把原来大量使用的Masonry实现布局的代码改成native直接布局,其他地方的block使用不做限制。
原因是Masonry通过语法糖,使用链式编程和block实现动态布局。这样会使代码段急剧增加。改成改成native直接布局后可以节约一半甚至更多的空间。舍弃便利换取空间。

b.定期检查删除不用的方法和类
目前已经有很多工具可以帮助我们检测不用的类和方法了,我列举一个如下:
https://github.com/ming1016/SMCheckProject

c.宏方法需要使用得当
我们都知道,宏方法会在使用它的地方完全展开。
我们项目中曾经有一个宏方法是在字典中查找一个值,这个字典以宏的形式存在,长期下来字典愈来愈大,而使用这个宏方法的地方越来越多,最终导致代码段猛增。修改方法很简单,直接把字典写在文件中写一个工具类管理,在启动后读到内存中就ok了。

d.避免拷贝代码,尽量抽象作用相同的代码
这一点其实应该算是程序设计层面了,不管是否现在代码段大小,我们都应该这么做。
但是,项目中确实存在这种情况,原因可能是写代码的时候偷懒直接拷贝类似代码修改,或者不知道已经存在类似逻辑,而重新写了一套。

e.尽量组件化,提高复用度
这一点和上一点类似。由于长期受代码段大小限制,我们公司已经做出了一套组件化,和后台控制前端layout的解决方案。这里不再详述。总体思想就是把UI组件根据元素个数,类型和布局形式实现不同的组件,组件内部各个元素的布局和数据由后端下发参数控制。因为这涉及到后端其实开发过程中比原生开发更麻烦,但是确实实现了组件化和复用。

引用:
https://blog.csdn.net/zgzczzw/article/details/79855660
https://github.com/ming1016/SMCheckProject

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

推荐阅读更多精彩内容

  • 1、通过CocoaPods安装项目名称项目信息 AFNetworking网络请求组件 FMDB本地数据库组件 SD...
    阳明先生_X自主阅读 15,979评论 3 119
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,094评论 1 32
  • 90天践行目标: 目标 1. 自己的事情自己做 目标 2. 尊重他人、尊重自己 一、根据践行目标,每天进行故事...
    璨璨妈妈阅读 237评论 0 0
  • 清醒的看着自己死去是什么感受呢? 曾经想过,如果结婚,一定要跟自己最爱的那个人,绝对不会因为将就而结婚,原来,时间...
    寄君于花瓣阅读 230评论 0 0
  • 001 成功的“演员” 从孩童到金融大亨,芒格不论是在学习、工作领域还是生活体验方面的经历都十分丰富,他用自律、专...
    阿白白_阅读 298评论 0 0