iOS 性能优化(包体积优化、内存优化、流畅性优化、启动优化、耗电优化)
目录
一、包体积优化
二、内存优化
三、流畅性优化
四、启动优化
五、耗电优化
一、包体积优化
1、图片:
本地图片尽可能改为从网络下载。
本地图片可以无损压缩减小图片大小。
使用Assets.xcassets来管理图片。
使用阿里云的iconfont加载图片。
2、合并功能重复的类库,删除不必要的文件和第三方库
3、清除类里面不用的代码
二、内存优化
1、重用问题:如UITableViewCells、UITableViewHeaderFooterViews等设置正确的reuseIdentifier,充分重用;
2、尽量把view设置为不透明(alpha最好不要是0):可设置opque为NO,图层的半透明取决于图片和其本身合成的图层为结果,可提高性能;
3、不要使用太复杂的XIB/Storyboard:不仅后期维护困难,而且比纯代码耗能太多。
4、尽量使用frame布局,不要使用autolayout
5、选择正确的数据结构,避免反复处理数据:减少接口调用次数。选择对业务场景最合适的数组结构,来极少数据操作。
6、gzip/zip压缩:当从服务端下载相关附件时,可以通过gzip/zip压缩后再下载,使得内存更小,下载速度也更快。
7、延迟加载:对象懒加载。比如,网络请求失败时显示的提示界面,可能一直都不会使用到,因此应该使用延迟加载。
8、数据缓存:
对于cell的行高要缓存起来,使得reload数据时,效率也极高。
对于一些网络数据不需要每次都请求的,应该缓存起来,
可以写入数据库,也可以通过plist文件存储。
9、处理内存警告:不需要的对象及时释放
10、重用大开销对象:一些objects的初始化很慢,比如NSDateFormatter和NSCalendar,但又不可避免地需要使用它们。通常是作为属性存储起来,防止反复创建。
11、使用Autorelease Pool:在某些循环创建临时变量处理数据时,自动释放池以保证能及时释放内存;
12、使用instruments等工具排查内存泄漏,减少或避免泄漏
三、流畅性优化
除了以上,
13、线程优化,耗时操作放到子线程:例如,子线程请求数据,主线程刷新UI
14、runloop的mode,scrollview滑动时使用UITrackingRunLoopMode,其他情况使用kCFRunLoopDefaultMode
15、尽量减少视图数量和层次。
16、减少离屏渲染。
- On-Screen Rendering:当前屏幕渲染,在当前用于显示的屏幕缓冲区进行渲染操作
- Off-Screen Rendering:离屏渲染,在当前屏幕缓冲区以外新开辟一个缓冲区进行渲染操作
离屏渲染消耗性能的原因
- 需要创建新的缓冲区
- 离屏渲染的整个过程,需要多次切换上下文环境,先是从当前屏幕(On-Screen)切换到离屏(Off-Screen);等到离屏渲染结束以后,将离屏缓冲区的渲染结果显示到屏幕上,又需要将上下文环境从离屏切换到当前屏幕
- +++哪些操作会触发离屏渲染?
- 光栅化,layer.shouldRasterize = YES
- 遮罩,layer.mask
- 圆角,同时设置layer.masksToBounds = YES、layer.cornerRadius大于0
- 考虑通过CoreGraphics绘制裁剪圆角,或者叫美工提供圆角图片
- 阴影,layer.shadowXXX
- 如果设置了layer.shadowPath就不会产生离屏渲染
四、启动优化
1、按需加载,不必要的接口后置请求,包含数据结构优化,前后端定义好需要哪些数据。
2、启动图压缩,减小大小
3、广告图空闲时间预加载,下次启动再展示
4、线程优化,耗时操作放在子线程
5、移除不需要的动态库(dylib)、类、库,可减少加载和编译时间
6、减少宏定义、静态变量
7、release版不要打印(NSLog)
五、耗电优化
程序的耗电主要在以下四个方面:
- CPU 处理
- 定位
- 网络
- 图像
优化的途径主要体现在以下几个方面:
- 尽可能降低 CPU、GPU 的功耗。
- 尽量少用 定时器。
- 优化 I/O 操作。
- 不要频繁写入小数据,而是积攒到一定数量再写入
- 读写大量的数据可以使用 Dispatch_io ,GCD 内部已经做了优化。
- 数据量比较大时,建议使用数据库
- 网络方面的优化
- 减少压缩网络数据 (XML -> JSON -> ProtoBuf),如果可能建议使用 ProtoBuf。
- 如果请求的返回数据相同,可以使用 NSCache 进行缓存
- 使用断点续传,避免因网络失败后要重新下载。
- 网络不可用的时候,不尝试进行网络请求
- 长时间的网络请求,要提供可以取消的操作
- 采取批量传输。下载视频流的时候,尽量一大块一大块的进行下载,广告可以一次下载多个
- 定位层面的优化
- 如果只是需要快速确定用户位置,最好用 CLLocationManager 的 requestLocation 方法。定位完成后,会自动让定位硬件断电
- 如果不是导航应用,尽量不要实时更新位置,定位完毕就关掉定位服务
- 尽量降低定位精度,比如尽量不要使用精度最高的 kCLLocationAccuracyBest
- 需要后台定位时,尽量设置 pausesLocationUpdatesAutomatically 为 YES,如果用户不太可能移动的时候系统会自动暂停位置更新
- 尽量不要使用 startMonitoringSignificantLocationChanges,优先考虑 startMonitoringForRegion:
- 硬件检测优化
- 用户移动、摇晃、倾斜设备时,会产生动作(motion)事件,这些事件由加速度计、陀螺仪、磁力计等硬件检测。在不需要检测的场合,应该及时关闭这些硬件
iOS 性能优化(包体积优化、内存优化、流畅性优化、启动优化、耗电优化)相关推荐
- Unity - 性能优化 - 包体,内存 - 偏静态资源的优化
文章目录 静态资源优化 - AssetPostprocessor Texture 压缩 Model 网格.动画 压缩 音频压缩 纹理的优化经验 尺寸 通道 发布出来的包资源再次分析 如何工具快速定位静 ...
- 【flutter】应用瘦身优化包体积
资源优化 1.删除无用代码和资源文件 2.压缩图片 3.代码优化 4.混淆 5.分架构构建apk 1.删除无用代码和资源文件 每个应用在版本迭代的过程中都会产生很多弃用代码甚至模块,同时也会产生很多不 ...
- 【Tomcat】如何优化tomcat配置(从内存、并发、缓存4个方面)优化
一.Tomcat内存优化 ** Tomcat内存优化主要是对 tomcat 启动参数优化,我们可以在 tomcat 的启动脚本 catalina.sh 中设置 java_OPTS 参数. JAVA_O ...
- 【Android】关于D8/R8那些事:Desugaring脱糖、APK包体积优化等
Desugaring脱糖? 不同的Android版本支持的Jvm版本不同,当使用当前Abndroid版本不支持的高版本jdk语法时,需要在编译期转换为其支持的低版本jdk语法,这个过程成为desuga ...
- 性能优化之三——包体积优化大战
博客结构 1.优化意义 2.分析工具 1.APK Analys 2.重要参数诠释 3.编包流程 4.优化战法 1.常规战法 1.清理无用资源 1.Lint工具 2.开启shrinkResources去 ...
- iOS包体积优化-图片优化
文中提到的优化措施,编写了python自动化脚本,适用于iOS项目. 地址:GitHub - dongzhixuanyuan/imagesOptimize: Optimize images to de ...
- vue性能优化之build后包体积太大(1)
基于vue-cli3.0构建项目,npm引入多个第三方包.build之后,包体积太大导致首屏过长.----毫无体验感!!! 实践的项目喜欢捣鼓可以clone下来 只总结了亲测效果明显的几种方案,解决方 ...
- iOS性能优化-内存优化(1)
1.iOS的内存管理机制 Objective-C语言本身是支持垃圾回收机制的,但有平台局限性,仅限于Mac桌面系统开发中. 而在iPhone和iPad等苹果移动终端设备中是不支持垃圾回收机制的.在移动 ...
- iOS 性能优化总结
原文链接:https://github.com/skyming/iOS-Performance-Optimization 关于 iOS 性能优化梳理: 基本工具.业务优化.内存优化.卡顿优化.布局优化 ...
- 游戏性能优化技术干货分享——内存管理
项目的性能优化主要围绕CPU.GPU和内存三大方面进行.接上期CPU优化专讲,我们本期和大家分享内存方面的优化心得. 无论是游戏还是VR应用,内存管理都是其研发阶段的重中之重. 然而,在我们测评过的大 ...
最新文章
- java压缩解压缩类实例[转]
- 了解 C# “.NET研究”4 中的 Dynamic 关键字
- 【UIKit】UIView基础学习
- 嵌入式Linux C笔试题积累(转)
- C语言程序设计教学探讨,C语言程序设计多媒体教学探讨
- 什么能在main()函数之前或之后执行
- 拓扑排序基础题——排序
- php泥浆护壁,谈一下静态泥浆护壁的湿式旋挖工法施工 常见质量方面问题处理...
- mysql 5.5.46_MySQL 5.5.46源码安装
- 数据中心201812-4
- H5如何实现唤起APP
- 结合模电分析电流源电路(简单晶体管电流源,Howland电流源,压控电流源)
- java中的各种平均数
- html+css+js(未完待续)
- springboot 发送短信
- iOS-检查版本更新
- 魔兽争霸 php文件,[War3]Fdf文件详解,简单的UI教程演示-by CarlosX
- Leetcode刷题面试题 16.14. 最佳直线
- html_label标签
- 双硬盘下安装win+linux关于开机引导的问题
热门文章
- mess组网 中继_Mesh中继模式,哪个联网比较好?
- cadence17.2安装教程
- 小度计算机笔记,开售告罄、口碑炸裂、高语音交互率的小度耳机全新升级语音笔记...
- Mybatis缓存实现原理
- WPS Excel表格安装宏插件
- MySQL数据库主从同步,一致性解决方案
- Javascript跨域和Ajax跨域解决方案总结
- html5手机摄像头相册批量,h5调用手机摄像头/相册(示例代码)
- 虚拟化: 物理CPU与VCPU的关系 || 内存上限说起 VMware内存分配初探
- C# 第五章『面向对象』◆第9节:抽象类和密封类