iOS性能优化(精一)
*导读: *
如果你只会UITabelView的性能优化,请不要说你懂iOS性能优化,下面是我开发这么多年项目中会影响性能的点,我想会对你的项目起到很大的作用
性能优化主要有这些:
1、性能优化:内存优化、速度优化;
2、代码优化(后续迭代);
3、程序的体积可以优化
一、APP性能优化
1、UITableViewCell的优化
我曾经在博客中有详细说明 ,这里就不细说了
http://www.ios520junge.com/2014/06/06/由浅入深精讲uitabelview/
**
**
**2、网络请求优化
**
①利用第三方AFN时做网络隔离,减少对第三方的依赖性;
②UI功能设计时,减少同一时间多次网络请求的可能性;
③请求数据用JSON,如果用XML代表在网络数据解析这块会浪费很多性能,两者都是常见的数据编码方式,压缩模式的效率在很大程度上取决于待压缩数据,而通常情况下,JSON都是一种最高效的模式
**
**
**3、图片加载的优化
**
对于这个可以深入研究下SDWebImage框架的底层实现
4、在编码过程中
①应该做懒加载、单例、封装处理的有没有处理,如:多个控制器基础搭建很像,有没有抽baseController;
②切圆角图片时,用的什么技术(直接切圆角和用贝塞尔路径进行画是有很大影响的,后续会提供专门的文章进行说明),切完后有没有做缓存处理
补充:
5、尽量把views设置为完全不透明
如果你有透明的Views你应该设置它们的opaque(不透明)属性为YES,如:黑色半透明的可以设置为一个灰色不透明的View替代,原因是这会使系统用一个最优的方式渲染这些views
Apple的文档对于为图片设置透明属性的描述是:
opaque
这个属性给渲染系统提供了一个如何处理这个view的提示;YES, 渲染系统就认为这个view是完全不透明的,这使得渲染系统优化一些渲染过程和提高性能。如果设置为NO,渲染系统正常地和其它内容组成这个View
只要一个视图的不透明度小于1,就会导致blending(混合像素颜色的计算)
,blending操作在iOS的图形处理器(GPU)中完成的。举个例子,我们把两个图层叠加在一起,如果第一个图层的有透明效果,则最终像素的颜色计算需要将第二个图层也考虑进来。这一过程即为Blending。
为什么Blending会导致性能的损失?
如果一个图层是完全不透明的,则系统直接显示该图层的颜色即可。而如果图层是带透明效果的,则会引入更多的计算,因为需要把下面的图层也包括进来,进行混合后颜色的计算。
6、避免过于庞大的XIB
加载一个XIB的时候所有内容都被放在了内存里,包括任何图片,不会即刻用到的view,你这就是在浪费宝贵的内存资源了,
storyboard仅在需要时实例化一个view controller.
7、不要阻塞主线程
大部分阻碍主进程的情形是你的app在做一些牵涉到读写外部资源的I/O操作,比如存储或者网络
8、不要在Image Views中调整图片大小
保证图片的大小和UIImageView的大小相同。在运行中缩放图片是很耗费资源的,特别是UIImageView嵌套在UIScrollView中的情况下;
如果图片是从远端服务加载的你不能控制图片大小,用background thread,缩放一次,然后在UIImageView中使用缩放后的图片
9、选择正确的Collection
Apple有一个 Collections Programming Topics(集合的编程问题) 的文档详尽介绍了可用的classes间的差别和你该在哪些场景中使用它们,如:
* Arrays: 有序的一组值。使用index来lookup(查找)很快,使用value lookup很慢, 插入/删除很慢。
* Dictionaries: 存储键值对。 用键来查找比较快。
* Sets: 无序的一组值。用值来查找很快,插入/删除很快。
10、重用和延迟加载(lazy load) Views
点击一个按钮的时候需要呈现一个view的场景:
- 创建并隐藏这个view当这个screen加载的时候,当需要时显示它;
- 当需要时才创建并展示。
方案一:更加消耗内存。但app操作更灵敏
方案二:消耗更少内存,但是会在点击按钮的时候比第一种稍显卡顿
选择方案:点击按钮时,懒加载这个view,这样就第一次卡顿,以后都不卡顿
11、Cache
缓存那些不大可能改变但是需要经常读取的东西。
如:远端服务器的响应,图片,甚至计算结果(UITableView的行高)
太多了,会在《iOS性能优化(精二)》中更新……
--
二、代码优化
一个app的开发过程是短暂的。后面的是永无止境的维护,更新,迭代;
节省我们后期维护代码的时间:
- 代码编写规范:声明、方法实现、懒加载、代理写在哪个地方
- 代码有没有严格遵守MVC或者MVVM设计模式,打造轻量级的Contreller
- 方法名、属性名取好,项目文档编写清晰