李洪强iOS开发之性能优化技巧

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

一、view优化

1、不透明的View 设置为opaque。

2、根据实际情况重用、延迟加载或预加载View。

3、减少subviews数量,定制复杂cell使用drawRect。尽量使用drawRect而不是layoutSubView。

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

二、UITableView优化

1、正确使用‘reuseIdentifier’重用cell。

2、尽量使所有的view opaque。

3、减少subviews数量,定制复杂cell使用drawRect。

4、尽量不调用‘cellForRowAtIndexPath’。调用cellForRowAtIndexPath会导致cell缓存失效

5、cache尽可能多的东西,包括行高。

三、缓存优化

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

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

3、方法指针缓存。如果一个方法在一个循环次数非常多的循环中使用,在进入循环前使用methodForSelector获取该方法的IMP,在循环体中直接调用该IMP。

四、线程优化

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

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

3、不重要的任务放在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];
}

五、内存优化

使用autorelease pool 降低内存峰值

六、代码细节优化

1、不在viewWillApear中进行费时操作

2、如果关键代码用C/C++效率更高就使用C/C++

七、图片优化

对图片数据进行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();

最新文章

  1. layer弹出框小结
  2. Field+offset(len)
  3. 学习总结 for循环语句的应用
  4. 用Drawing画图如何不会消失
  5. Lambda表达式的由来
  6. 关于java、Android中Math的一些用法
  7. hibernate级联保存问题,出错not-null property references a null or transient value
  8. cocospods 卡在 Analyzing dependencies
  9. JavaBean--删除操作
  10. css正三角倒三角
  11. 模块机制 之commonJs、node模块 、AMD、CMD
  12. SpringCloud+ZUUL跨域请求中的OPTIONS请求处理
  13. Spark机器学习基础三
  14. JVM总括二-垃圾回收:GC Roots、回收算法、回收器
  15. 51nod1305
  16. 微信小程序navigator
  17. 一本通1601【例 5】Banknotes
  18. Android平台上最好的几款免费的代码编辑器
  19. python 判断变量是否存在 防止报错
  20. P3084 [USACO13OPEN]照片Photo (dp+单调队列优化)

热门文章

  1. RN传参的问题
  2. More Effective C++ - 章节一 : 基础议题
  3. mysql5.7 在Centeros 6 下自动安装的shell脚本
  4. InnoDB INFORMATION_SCHEMA System Tables
  5. 8. Truncate undo表空间
  6. MySQL数据类型与操作
  7. 【HIHOCODER1527 】 快速乘法
  8. python基础——2(基本数据类型及运算符)
  9. Android开发——GPS定位
  10. 大数据学习——hive的sql练习