IOS 性能优化的几方面
性能调优,是一个永恒的话题。本文简单记录了IOS常见的性能考虑的方面。
计算代码运行时间。
1.利用`BNRtimeBlock` `NSDate`类计算代码运算时间。
善用xcode的性能分析工具
图片等多媒体资源
1. 优先使用`[UIImage imageNamed@""]` `ImageCache`类
- 使用gradient图片代替硬编码实现的gradient;
- 使用多线程来延迟加载资源、如图片.
复杂的UIView
1.对于复杂的View:
使用drawRect 自绘而不是从nib中载入。
2.对于TableView:
重用Cell;
减少cell初始化的工作量,延迟装载;
定制复杂cell时,使用drawRect自绘;
Cache 尽可能多的东西,包括cell高度。
多线程
1. 在线程中使用`autoreleasepool`管理内存
2. 将一些不太重要的任务放在idle时运行
>问:idle是什么时候?
>idle 根据自己应用的业务需求不同,一般来讲是任务不多的时候
注意时机
不要再`viewWillAppear`中做费时的操作,只进行背景色、字体等设置
关于后台任务
系统进入background后,有10分钟的运行时间,因此有很多值得注意的事项:
a)尽量减少内存的使用,当内存不足时,IOS将kill那些内存消耗多的app
b)释放所有的共享资源,比如Calendar 与 Address bool 当app进入后台时,若果还在使用共享资源,IOS会立即kill掉该应用程序
c)正确处理apps生命周期,当进入后台时,赢保持用户数据,以便回到前台时能够恢复,当进入后台时,IOS会保存当前App的一个快照,以便之后在合适的时候呈现给用户以提高用户体检,因此应该避免在屏幕上呈现用户信息,以免西楼用户个人资料。
编码方式
1. 混合编码。关键代码使用 C/C++/asm 效率更高就使用 C/C++/asm。
- 如果一个方法在一个循环次数非常多的循环中使用,在进入循环前使用 methodForSelector 获取该方法 IMP,然后在循环体中直接使用该 IMP。
关于内存释放
在 didReceiveMemoryWarning 中释放内存,比如cache 的图像,view 等,并记得调用 [supper didReceiveMemoryWarning]。清理函数 didReceiveMemoryWarning, viewDidUnload 和 dealloc 都是在方法结尾处调用 supper 的方法。
提高APP启动加载速度
1.避免使用静态初始化,包括静态c++对象,加载时会运行的代码,如+(void) load{} ,会造成在Main函数之前运行额外的代码。
2.减少ddl等动态链接库的数量。
善用cache,空间换时间。
1.cache 是一种常见的空间换时间的提供性能的收到,可以用在相当多的场合。
2.尽量cache 那些可重复利用的对象,比如 table cell,date/number formatters,正则表达式,sqlite语句等。
数据库
1.缓存经常用到的 sqlite语句;
2.优化数据库查询语句,用sqlite3_trace和sqlite3_profile来查找性能差的语句;
3.如果可能的话,缓存查询结果;
3.在使用 sqlite_prepare会将SQL查询编译成字节码,要使用bind,重用那些已经prepared的语句。