iOS开发之性能优化

性能问题的主要缘由是什么,缘由有相同的,也有不一样的,但归根到底,不外乎内存使用、代码效率、合适的策略逻辑、代码质量、安装包体积这一类问题。git

但从用户体验的角度去思考,当咱们置身处地得把本身当作用户去玩一款应用时候,那么都会在乎什么呢?假如正在玩一款手游,首先必定不但愿玩着玩着忽然闪退,而后就是不但愿卡顿,其次就是耗电和耗流量不但愿太严重,最后就是安装包但愿能小一点。简单归类以下:
快:使用时避免出现卡顿,响应速度快,减小用户等待的时间,知足用户指望。程序员

稳:不要在用户使用过程当中崩溃和无响应。github

省:节省流量和耗电,减小用户使用成本,避免使用时致使手机发烫。面试

小:安装包小能够下降用户的安装成本。缓存

1、快
应用启动慢,使用时常常卡顿,是很是影响用户体验的,应该尽可能避免出现。卡顿的场景有不少,按场景能够分为4类:UI 绘制、应用启动、页面跳转、事件响应。引发卡顿的缘由不少,但无论怎么样的缘由和场景,最终都是经过设备屏幕上显示来达到用户,归根到底就是显示有问题,根据iOS 系统显示原理能够看到,影响绘制的根本缘由有如下两个方面:
1.绘制任务过重,绘制一帧内容耗时太长。
2.主线程太忙,根据系统传递过来的 VSYNC 信号来时还没准备好数据致使丢帧。性能优化

绘制耗时太长,有一些工具能够帮助咱们定位问题。主线程太忙则须要注意了,主线程关键职责是处理用户交互,在屏幕上绘制像素,并进行加载显示相关的数据,因此特别须要避免任何主线程的事情,这样应用程序才能保持对用户操做的即时响应。总结起来,主线程主要作如下几个方面工做:
1.UI 生命周期控制
2.系统事件处理
3.消息处理
4.界面布局
5.界面绘制
6.界面刷新除此以外,应该尽可能避免将其余处理放在主线程中,特别复杂的数据计算和网络请求等。网络

2、稳
应用的稳定性定义很宽泛,影响稳定性的缘由不少,好比内存使用不合理、代码异常场景考虑不周全、代码逻辑不合理等,都会对应用的稳定性形成影响。其中最多见的两个场景是:Crash 和 ANR,这两个错误将会使得程序没法使用,比较经常使用的解决方式以下:架构

1.提升代码质量。好比开发期间的代码审核,看些代码设计逻辑,业务合理性等。
2.代码静态扫描工具。常见工具备Clang Static Analyzer、OCLint、Infer等等。
3.Crash监控。把一些崩溃的信息,异常信息及时地记录下来,以便后续分析解决。
4.Crash上传机制。在Crash后,尽可能先保存日志到本地,而后等下一次网络正常时再上传日志信息。并发

3、省
在移动设备中,电池的重要性不言而喻,没有电什么都干不成。对于操做系统和设备开发商来讲,耗电优化一致没有中止,去追求更长的待机时间,而对于一款应用来讲,并非能够忽略电量使用问题,特别是那些被归为“电池杀手”的应用,最终的结果是被卸载。所以,应用开发者在实现需求的同时,须要尽可能减小电量的消耗。工具

1.CPU

不论用户是否正在直接使用, CPU 都是应用所使用的主要硬件, 在后台操做和处理推送通知时, 应用仍然会消耗 CPU 资源

应用计算的越多,消耗的电量越多.在完成相同的基本操做时, 老一代的设备会消耗更多的电量, 计算量的消耗取决于不一样的因素

2.网络
智能的网络访问管理可让应用响应的更快,并有助于延长电池寿命.在没法访问网络时,应该推迟后续的网络请求, 直到网络链接恢复为止. 此外,应避免在没有链接 WiFi 的状况下进行高宽带消耗的操做.好比视频流, 众所周知,蜂窝无线系统(LTE,4G,3G等)对电量的消耗远远大于 WiFi信号,根源在于 LTE 设备基于多输入,多输出技术,使用多个并发信号以维护两端的 LTE 连接,相似的,全部的蜂窝数据连接都会按期扫描以寻找更强的信号. 所以:咱们须要
1)在进行任何网络操做以前,先检查合适的网络链接是否可用

2)持续监视网络的可用性,并在连接状态发生变化时给与适当的反馈

3).定位管理器和 GPS

咱们都知道定位服务是很耗电的,使用 GPS 计算坐标须要肯定两点信息:

1)时间锁每一个 GPS 卫星每毫秒广播惟一一个1023位随机数, 于是数据传播速率是1.024Mbit/s GPS 的接收芯片必须正确的与卫星的时间锁槽对齐
2)频率锁 GPS 接收器必须计算由接收器与卫星的相对运动致使的多普勒偏移带来的信号偏差

计算坐标会不断的使用 CPU 和 GPS 的硬件资源,所以他们会迅速的消耗电池电量, 那么怎么减小呢?

1)关闭可有可无的特性
判断什么时候须要跟踪位置的变化, 在须要跟踪的时候调用 startUpdatingLocation方法,无须跟踪时调用stopUpdatingLocation方法.

当应用在后台运行或用户没有与别人聊天时,也应该关闭位置跟踪,也就说说,浏览媒体库,查看朋友列表或调整应用设置时, 都应该关闭位置跟踪

2)只在必要时使用网络

为了提升电量的使用效率, IOS 老是尽量地保持无线网络关闭.当应用须要创建网络链接时,IOS 会利用这个机会向后台应用分享网络会话,以便一些低优先级可以被处理, 如推送通知,收取电子邮件等

关键在于每当用户创建网络链接时,网络硬件都会在链接完成后多维持几秒的活动时间.每次集中的网络通讯都会消耗大量的电量

要想减轻这个问题带来的危害,你的软件须要有所保留的的使用网络.应该按期集中短暂的使用网络,而不是持续的保持着活动的数据流.只有这样,网络硬件才有机会关闭

4.屏幕
屏幕很是耗电, 屏幕越大就越耗电.固然,若是你的应用在前台运行且与用户进行交互,则势必会使用屏幕并消耗电量

这里有一些方案能够优化屏幕的使用:

1)动画优化
当应用在前台时, 使用动画,一旦应用进入了后台,则当即暂停动画.一般来讲,你能够经过监听 UIApplicationWillResignActiveNotification或UIApplicationDIdEnterBackgroundNotification的通知事件来暂停或中止动画,也能够经过监听UIApplicationDidBecomeActiveNotification的通知事件来恢复动画

2)视频优化
视频播放期间,最好保持屏幕常量.可使用UIApplication对象的idleTimerDisabled属性来实现这个目的.一旦设置了 YES, 他会阻止屏幕休眠,从而实现常亮.
与动画相似,你能够经过相应应用的通知来释放和获取锁

用户老是随身携带者手机,因此编写省电的代码就格外重要, 毕竟手机的移动电源并非随处可见, 在没法下降任务复杂性时, 提供一个对电池电量保持敏感的方案并在适当的时机提示用户, 会让用户体验良好。

4、小
应用安装包大小对应用使用没有影响,但应用的安装包越大,用户下载的门槛越高,特别是在移动网络状况下,用户在下载应用时,对安装包大小的要求更高,所以,减少安装包大小可让更多用户愿意下载和体验产品。

固然,瘦身和减负虽好,但须要注意瘦身对于项目可维护性的影响,建议根据自身的项目进行技巧的选取。

App安装包是由资源和可执行文件两部分组成,安装包瘦身从如下三部分优化。

资源优化:

  1. 删除无用的资源

2.删除重复的资源

3.无损压缩图片

4.不经常使用资源换为下载

编译优化:

1.去除debug符号

2.开启编译优化

3.避免编译多个架构

可执行文件优化:

1.去除无用代码

2.统计库占用,去除无用库

3.混淆类/方法名

4.减小冗余字符串

5.ARC->MRC (通常不到特殊状况不建议这么作,会提升维护成本)

缩减iOS安装包大小是不少中大型APP都要作的事,通常首先会对资源文件下手,压缩图片/音频,去除没必要要的资源。这些资源优化作完后,咱们还能够尝试对可执行文件进行瘦身,项目越大,可执行文件占用的体积越大,又由于AppStore会对可执行文件加密,致使可执行文件的压缩率低,压缩后可执行文件占整个APP安装包的体积比例大约有80%~90%,仍是挺值得优化的。

下面是一些常见的优化方案:

TableViewCell 复用

在cellForRowAtIndexPath:回调的时候只建立实例,快速返回cell,不绑定数据。在willDisplayCell: forRowAtIndexPath:的时候绑定数据(赋值)。

高度缓存

在tableView滑动时,会不断调用heightForRowAtIndexPath:,当cell高度须要自适应时,每次回调都要计算高度,会致使 UI 卡顿。为了不重复无心义的计算,须要缓存高度。

怎么缓存?

字典,NSCache。

UITableView-FDTemplateLayoutCell

[if !supportLineBreakNewLine]

[endif]

视图层级优化

不要动态建立视图

在内存可控的前提下,缓存subview。

善用hidden。

[if !supportLineBreakNewLine]

[endif]

减小视图层级

减小subviews个数,用layer绘制元素。

少用clearColor,maskToBounds,阴影效果等。

[if !supportLineBreakNewLine]

[endif]

减小多余的绘制操做

图片

不要用JPEG的图片,应当使用PNG图片。

子线程预解码(Decode),主线程直接渲染。

由于当image没有Decode,直接赋值给imageView会进行一个Decode操做。

优化图片大小,尽可能不要动态缩放(contentMode)。

尽量将多张图片合成为一张进行显示。

[if !supportLineBreakNewLine]

[endif]

减小透明view使用透明view会引发blending,在iOS的图形处理中,blending主要指的是混合像素颜色的计算。最直观的例子就是,咱们把两个图层叠加在一块儿,若是第一个图层的透明的,则最终像素的颜色计算须要将第二个图层也考虑进来。这一过程即为Blending。

会致使blending的缘由:
UIView的alpha<1。

UIImageView的image含有alpha channel(即便UIImageView的alpha是1,但只要image含有透明通道,则仍会致使blending)。

[if !supportLineBreakNewLine]

[endif]

为何blending会致使性能的损失?

缘由是很直观的,若是一个图层是不透明的,则系统直接显示该图层的颜色便可。而若是图层是透明的,则会引发更多的计算,由于须要把另外一个的图层也包括进来,进行混合后的颜色计算。

opaque设置为YES,减小性能消耗,由于GPU将不会作任何合成,而是简单从这个层拷贝。

[if !supportLineBreakNewLine]

[endif]

减小离屏渲染

离屏渲染指的是在图像在绘制到当前屏幕前,须要先进行一次渲染,以后才绘制到当前屏幕。

OpenGL中,GPU屏幕渲染有如下两种方式:

On-Screen

Rendering即当前屏幕渲染,指的是GPU的渲染操做是在当前用于显示的屏幕缓冲区中进行。

Off-Screen

Rendering即离屏渲染,指的是GPU在当前屏幕缓冲区之外新开辟一个缓冲区进行渲染操做。

[if !supportLineBreakNewLine]

[endif]

小结
性能优化不是更新一两个版本就能够解决的,是持续性的需求,持续集成迭代反馈。在实际的项目中,在项目刚开始的时候,因为人力和项目完成时间限制,性能优化的优先级比较低,等进入项目投入使用阶段,就须要把优先级提升,但在项目初期,在设计架构方案时,性能优化的点也须要提前考虑进去,这就体现出一个程序员的技术功底了。何时开始有性能优化的需求,每每都是从发现问题开始,而后分析问题缘由及背景,进而寻找最优解决方案,最终解决问题,这也是平常工做中常会用到的处理方式。

小编特意为你们整理了一份BAT面试题,须要的能够加小编的QQ群:923910776 但愿对你们有所帮助,后期会不断更新添加新的面试题,能够帮你们查漏补缺。
相关文章
相关标签/搜索