iOS App性能提升秘笈
2015-01-18 本文已影响469人
windgo
- 如果要做一个优秀的iOS app, 工程师的职责, 就是尽可能的优化App的性能.
- 本文绝大多数内容来自Macelo Fabri的文章, 重新进行了组织.
- 本文没有提Instruments,但是,它其实是性能优化的前提。他正如易学中的诊断阶段,下面列出的都是治疗的配方。
1. 内存
1.1 使用ARC管理内存
在大多数情况下, 都应该使用ARC, 因为:
- 使用ARC, 当你的对象不用时, 系统会尽快的帮你进行release. MRC的话未必能保证.
- 使用ARC, 能帮你减少内存泄露.
1.2 选用合适的集合
- NSArray, NSet, NSDictionary, 适用场景不同, 谨慎选择.
1.3 处理操作系统的内存警告
- 其实这个不能说是性能问题, 而是你的应用在前台会挂掉, 或者被系统从后台清理掉.
1.4 使用 Autorelease Pool
2. UI
2.1 尽量使用 reuseIdentifier
- 对于UITableView和UICollectionView中的Cell等, 使用reuseIdentifier, 可以避免每次都重新创建Cell.
2.2 尽可能设置Views 为 Opaque(不透明)
- 如果你的View不是透明的, 那就显式的设置Opaque为YES, 这样系统在绘制的时候, 就可以进行一定的优化. 虽然设置起来很繁琐, 但是尽可能多的设置吧.
2.3 避免很大的XIBs文件
- 就算你只使用了XIBs文件中的一个view, 系统在加载XIBs文件的时候, 也会整个加载. 所以尽量保证每个XIBs文件中只有一个View. 但是StoryBoard没有这个问题, 如果要将多个View放在一起, 尽量使用StoryBoard.
2.4 保证Images和UIImageView的大小相同(别缩放)
- 如果这两者尺寸不一致, 显示的时候就会发生缩放. 缩放是耗时操作, 在滚动视图中尤其耗时.
2.5 重用或者懒加载Views
- 这个没啥好说的... ...
2.6 考虑使用绘图函数
- 减少了图片的使用, 适当考虑.
2.7 采用合适的手段设置背景图片
- 对于重复铺满的背景图片, 可以使用UIColoer进行设置.
2.8 使用Shadow Path设置阴影
2.9 优化你的Table Views
3. 多线程
3.1 不要阻塞主线程
- 主线程在处理UI, 如果进行耗时操作, 发生了阻塞, 就等着卡吧.
3.2 小心在线程里大量的分配内存空间
- 堆是有锁的, 每一个时刻, 只能有一个线程进行内存分配操作.
4. 网络
4.1 启用GZIP 压缩
- iOS和Web服务器对GZIP的支持很好, 尤其对于文本类(Json, XML)的压缩率很高, 能压缩到原来的1/5左右, 所以值得采用.
4.2 减少不必要的Web数据传输
- 如果只需要用户名和头像, 就别把性别, 城市, 兴趣爱好什么一起传过来.
5. 持久化
5.1. 选择正确的数据存储方式
- NSUserDefaults
- 结构化文件: XML, JSON, or Plist format
- 归档: Archive using NSCoding
- 数据库: SQLite
- Core Data.
6. 其他
6.1缓存
- 通过内存, 文件系统, 数据库对网络数据等进行缓存, 是提高性能的不二法则. 空间纬度上越近, 访问越快.
6.2 重用创建代价很大的对象
- 不需解释, 这也是为什么单例模式的存在.
6.3 避免重复处理数据
- 比如解析Json数据, 比如计算表格高度
6.4 选择合适的数据格式(XML, JSON)
- 一般来说xml数据大, 但是支持校验, 支持SAX解析, json数据小.
6.5 减少启动时间
- 这对应用体验很重要
6.6 避免使用Date Formatters
- 这货性能很差
6.7 启用编译器优化选项
- 默认的优化器选项是 -Os, 最快最小。 但是如果不是专门进行科学计算的应用,你可以使用-Ofast,如果需要IEEE浮点运算,则可以使用-O3。这两个选项通常只会增加百分之几的应用体积,但是性能会显著提升。
6.8 启用连接器优化
- 通过LTO进行连接优化。普通的设置,只是在单个.m文件内进行优化,启用该选项后,会在项目的全局范围内进行优化。
6.9 使用Accelerate框架
- 这个库里提供了很多数学函数库,可以帮助你提升性能。