本文主要从以下七个方向来探讨IOS的项目优化
1.CPU性能优化
CUP主要负责对象的创建销毁,布局的计算,文本的计算和排版,图片解码,图像绘制等
我们可以对CUP进行如下优化
1.1 尽量使用轻量级的对象,比如用不到事件处理的地方,可以考虑使用CALayer代替UIView
1.2 不要频繁的调用UIView的相关属性,尽量减少不必要的修改
1.3 尽量提前计算好布局,并且存在内存中,避免重复计算
1.4 自己手动设置frame比Autolayout消耗资源更少
1.5 图片的size最好刚好和UIImageView的size保持一致,避免缩放算法
1.6 尽量把耗时的操作放到子线程(比如文本的尺寸计算,绘制,图片的解码绘制等)
参考YYKitDemo里的WBStatusTimelineViewController
2.GPU性能优化
GPU主要负责纹理的渲染,针对GPU,我们可以做以下优化:
2.1 尽可能将多张图片合成一张进行显示
2.2 尽量减少视图的数量和层次,视图的数量和层次越多,需要渲染的图层就越多
2.3 减少透明的视图,特别是上层视图透明,这样会导致像素的混合计算
2.4 尽量避免出现离屏渲染,想了解离屏渲染,可以移步我另一篇文章juejin.cn/post/700586…
3.内存优化
3.1 我们可以通过Xcode的Analyze静态分析我们的代码,检测没用到的变量及一些语法错误等
3.2 我们可以通过Xcode-Open Developer Tool-Instruments-Leaks来动态检测内存泄漏
4.卡顿优化
4.1 我们可以通过runloop来检测项目的卡顿情况,还有别的方法欢迎补充,使用runloop检测卡顿可以参考:github.com/search?q=LX…
5.耗电优化
5.1 少用定时器
5.2 数据量大的尽量使用数据库
5.3 减少压缩网络数据
5.4 用适当的缓存代替频繁的网络请求
5.5 定位如果不要求实时性,则定位完毕及时关掉
5.6 断点续传
6.APP启动优化,主要针对冷启动优化
6.1 可以通过添加环境变量可以打印出APP的启动时间分析(Edit scheme -> Run -> Arguments) 冷启动的三大阶段:1.dyld 2.runtime 3.main
6.1.1 dyld:Apple的动态连接器,可以用来装在Mach-0文件
优化:
减少动态库,合并一些动态库
减少Objc类,分类的数量,减少Selector数量,定期清理没有使用的类,分类
减少C++虚函数数量
swift尽量使用struct代替类
6.1.2 runtime:
调用map_images进行可执行文件内容的解析和处理
在load_images中调用call_load_methods,调用所有Class和Category的+load方法
进行各种objc结构的初始化(注册Objc类,初始化类对象等)
通过C++静态初始化器和_attribute_((constructor))修饰的函数
到此为止,可执行文件和动态库中的所有符号(Class,Protocol,Selector,IMP...)都已经按格式成功加载到内存中,被runtime所管理
优化:用+initialize+单例代替+load
6.1.3 调用main函数
优化:在不影响用户体验的前提下,尽可能将一些操作延迟,不要全部放在finishLaunching中
6.1.4 二进制重排推荐文章:juejin.cn/post/684490…
7.APP瘦身
7.1 图片资源进行无损压缩
7.2 去除没用到的资源:github.com/tinymind/LS… github.com/netyouli/WH…
7.3 检测未使用的代码:github.com/netyouli/WH…