客官,里边请!
前言:
大家在开发中,APP性能优化这一块肯定是不可忽视的!可以说这是关乎生死存亡。那么我们该如何测试、优化性能呢?下面我们结合我开发中遇到的情况总结了一下,供大家参考。
正文:
instruments:Xcode自带的测试工具
想要优化性能,第一步是测试,有些点我们能够在编写代码的时候进行优化,但有时候我们多少还是会出现一些性能或内存泄露问题。我们主要使用两个工具:查看程序哪些部分最耗时,可以使用Time Profiler,要查看内存是否泄漏了,就可以使用Leaks。避免使用过于复杂的XIB
当你加载一个XIB的时候所有内容都被放在了内存里,包括任何图片。如果有一个不会即刻用到的view,你这就是在浪费宝贵的内存资源了。不要阻塞主线程
在iOS里关于UIKit的操作都是放在主线程,因此如果主线程被阻塞住了,你的UI可能无法及时响应事件,给人一种卡顿的感觉。大多数阻塞主线程的情况是在主线程做IO操作,比如文件的读写,包含数据库、图片、json文本或者log日志等,尽量将这些操作放放到子线程(如果数据库有一次有较多的操作,记得采用事务来处理,性能相差还是挺大的),或者在后台建立对应的dispatch queue来做这些操作,比如一个低级别的serial queue来负责log文件的记录等等。使用并优化缓存
一般为了提升用户体验,都会在应用中使用缓存。一个极好的原则就是,缓存所需要的,也就是那些不常改变但是需要经常读取的东西。比如对于图片资源可以使用SDWebImage这个开源库,里面就实现了一个图片缓存的功能。采用合适的渲染方法
在iOS中可以有很多方法做出漂亮的按钮。你可以用整幅的图片,可调大小的图片,或者可以用CALayer, CoreGraphics甚至OpenGL来画它们。还有比如经常设置的按钮或View的圆角,一般采用cornerRadius。但还是有些性能问题,如果圆角视图要多次使用,如如果每个tableViewCell都要加载,我建议可以通过自己用贝塞尔曲线去画圆角。处理内存警告
一旦系统内存过低,iOS会通知所有运行中app。在官方文档中是这样记述:
如果你的app收到了内存警告,它就需要尽可能释放更多的内存。最佳方式是移除对缓存,图片object和其他一些可以重创建的objects的strong references.
幸运的是,UIKit提供了几种收集低内存警告的方法:
· 在app delegate中使用applicationDidReceiveMemoryWarning:
的方法
· 在你的自定义UIViewController的子类(subclass)中覆盖didReceiveMemoryWarning
· 注册并接收 UIApplicationDidReceiveMemoryWarningNotification的通知
一旦收到这类通知,你就需要释放任何不必要的内存使用。
例如,UIViewController的默认行为是移除一些不可见的view,它的一些子类则可以补充这个方法,删掉一些额外的数据结构。一个有图片缓存的app可以移除不在屏幕上显示的图片。
这样对内存警报的处理是很必要的,若不重视,你的app就可能被系统杀掉。优化TableView
Table view需要有很好的滚动性能,不然用户会在滚动过程中发现动画的瑕疵。
为了保证table view平滑滚动,确保你采取了以下的措施:
· 正确使用reuseIdentifier
来重用cells
· 尽量使所有的view opaque,包括cell自身
· 避免渐变,图片缩放,后台选人
· 避免使用复杂的xib
· 如果cell内现实的内容来自web,使用异步加载,缓存请求结果
· 使用shadowPath
来画阴影
· 减少subviews的数量
· 尽量不适用cellForRowAtIndexPath:
,如果你需要用到它,只用一次然后缓存结果
· 使用正确的数据结构来存储数据
· 使用rowHeight
,sectionFooterHeight
和sectionHeaderHeight
来设定固定的高,不要请求delegate减少程序启动过程中的任务
当用户点击app的图标之后,程序应该尽可能快的进入到主页面,尽可能减少用户的等待时间,比如我们的应用程序在启动的时候会去做3d模型的渲染操作,完成之后在进入首页面展示,但其实我们可以先进入到主页面,将渲染3d的任务放到子线程去完成,缩短用户需要等待的时间。懒加载view
例如:不要在cell里面嵌套太多的view,这会很影响滑动的流畅感,而且更多的view也需要花费更多的CPU跟内存。假如由于view太多而导致了滑动不流畅,那就不要在一次就把所有的view都创建出来,把部分view放到需要显示cell的时候再去创建。避免反复处理数据
许多应用需要从服务器加载功能所需的常为JSON或者XML格式的数据。在服务器端和客户端使用相同的数据结构很重要;