优化的目的:使各种UI的反应灵敏,减少卡顿;提高运行速度;降低内存占用;提升用户体验;
第一部分:
一:instruments
使用instruments分析器分析工程性能,不要凭空想象;比如要查看程序哪些部分耗时时,可以使用Time Profiler,要查看内存是否泄漏时,可以使用Leaks等;
二:不要阻塞主线程
在iOS里关于UIKit的操作都是放在主线程中的,为防止UI可能无法及时响应事件,视觉上产生卡顿的感觉,要避免主线程阻塞;大多数阻塞主线的情况是在主线程做IO操作,比如文件的读写(包含数据库、图片、json文本或者log日志等),尽量将这些操作放到子线程进行(如果数据库有一次有较多的操作,记得采用事务处理【备注】,性能相差会挺大的),或者在后台建立对应的dispatch queue 来做这些操作(比如一个低级别的serial queue【连续队列】来负责log文件的记录),程序中的代码逻辑最好不要使用同步逻辑【备注】
三:使用cache
一般为了提升用户体验,都会在应用中使用缓冲。比如:图片资源可以使用SDWebImage开源库实现图片缓冲,该库中实现了一个图片缓冲的功能;
获取资源的具体过程如下:
业务层----> ResourceManager(资源管理)--->memory cache(内存缓冲)----> disk(硬盘) ---> internet(因特网) 【cache简单示意图】
具体描述:业务层根据资源的url向resourceManager获取应用的资源,resourceManager首先会到memory cache中获取资源,memory cache可以利用NSCache实现,因为NSCache首先是线程安全的,而且在收到内存警告的时候会自动释放对应的内存;如果memorycache中没有对应的资源再去disk中查找,disk也没有的话再去internet中获取,获取到的话,会更新到memorycache和disk中;
四:减少程序启动过程中的任务:
当用户点击app的图标之后,程序应该尽可能快的进入到主页面,尽可能减少用户的等待时间;比如:我们的应用程序在启动的时候会去做3d渲染操作,完成之后再进入首页展示,但其实我可以先进入首页,将3d渲染的任务放到子线程去完成,缩短用户需要等待的时间。