iOS性能优化技巧

经过静态 Analyze 工具,以及运行时 Profile 工具分析性能瓶颈,并进行性能优化。结合本人在开发中遇到的问题,能够从如下几个方面进行性能优化。缓存

1、view优化

一、不透明的View 设置为opaque。性能优化

二、根据实际状况重用、延迟加载或预加载View。服务器

三、减小subviews数量,定制复杂cell使用drawRect。尽可能使用drawRect而不是layoutSubView。函数

四、不直接调用drawRect、 layoutSubviews方法。万不得已时能够用替代方法: setNeedsDisplayInRect,layoutIfNeeded,替代方法也尽可能不要调用,经过合理的代码结构解决重布局问题,尽可能一次完成布局。工具

2、UITableView优化

一、正确使用‘reuseIdentifier’重用cell。布局

二、尽可能使全部的view opaque。post

三、减小subviews数量,定制复杂cell使用drawRect。性能

四、尽可能不调用‘cellForRowAtIndexPath’。调用cellForRowAtIndexPath会致使cell缓存失效优化

五、cache尽量多的东西,包括行高。ui

3、缓存优化

一、缓存不大可能改变可是须要常常读取的东西。远端服务器的响应、图片、计算结果。

二、重用大开销对象。对于初始化很慢的对象经过添加属性的方式保持该对象,保证只被初始化一次,屡次复用。如NSDataFormatter。

三、方法指针缓存。若是一个方法在一个循环次数很是多的循环中使用,在进入循环前使用methodForSelector获取该方法的IMP,在循环体中直接调用该IMP。

4、线程优化

一、 耗时操做使用子线程进行,或者放入任务队列中。

二、同步使用串行队列代替同步锁。

三、不重要的任务放在idle中运行

- (void)idleNotificationMethod {
    // do something here
}

- (void)registerForIdleNotification 
{
    [[NSNotificationCenter defaultCenter] addObserver:self
        selector:@selector(idleNotificationMethod)
        name:@"IdleNotification"
        object:nil];
        
    NSNotification *notification = [NSNotification
        notificationWithName:@"IdleNotification" object:nil];
        
    [[NSNotificationQueue defaultQueue] enqueueNotification:notification
      postingStyle:NSPostWhenIdle];
}

5、内存优化

使用autorelease pool 下降内存峰值

6、代码细节优化

一、不在viewWillApear中进行费时操做

二、若是关键代码用C/C++效率更高就使用C/C++

7、图片优化

对图片数据进行decode。在子线程中设置image的大小后,在imageview中使用缩放后的image。缘由:因为UIImage的imageWithData函数是每次画图的时候才将Data解压成ARGB的图像,因此在每次画图的时候,会有一个解压操做,UIImage初始化后仅仅是把图片加载到内存中,而实际的解码和重采样是在图片须要显示时才进行。

//图片重采样,在子线程中进行
CGSize itemSize = CGSizeMake(width, height);//实际要缩放的大小
UIGraphicsBeginImageContext(itemSize);
CGRect imageRect = CGRectMake(0.0, 0.0, itemSize.width, itemSize.height);
[image drawInRect:imageRect];
UIImage newImage = UIGraphicsGetImageFromCurrentImageContext(); //重采样后的图片
UIGraphicsEndImageContext();