IOS 性能优化的几方面

性能调优,是一个永恒的话题。本文简单记录了IOS常见的性能考虑的方面。

计算代码运行时间。

1.利用`BNRtimeBlock` `NSDate`类计算代码运算时间。

善用xcode的性能分析工具

图片等多媒体资源

1. 优先使用`[UIImage imageNamed@""]`  `ImageCache`类
  1. 使用gradient图片代替硬编码实现的gradient;
  2. 使用多线程来延迟加载资源、如图片.

复杂的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。
  1. 如果一个方法在一个循环次数非常多的循环中使用,在进入循环前使用 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的语句。