写在前面

  本文来自iOS Tutorial Team 的 Marcelo Fabri,他是Movile的一名 iOS 程序员。这是他的个人网站:http://www.marcelofabri.com/,你还可以在Twitter上关注@marcelofabri_。

  性能对 iOS 应用的开发尤其重要,如果你的应用失去反应或者很慢,失望的用户会把他们的失望写满App Store的评论。然而由于iOS设备的限制,有时搞好性能是一件难事。开发过程中你会有很多需要注意的事项,你也很容易在做出选择时忘记考虑性能影响。

  这正是我写下这篇文章的原因。这篇文章以一个方便查看的核对表的形式整合了你可以用来提升你app性能的25条建议和技巧。

  请耐心读完这篇文章,为你未来的app提个速!

  注意:每在优化代码之前,你都要注意一个问题,不要养成”预优化”代码的错误习惯。时常使用Instruments去profile你的代码来发现需要提升的方面。Matt Galloway写过一篇很棒的如何利用Instruments来优化代码的文章。

  还要注意的是,这里列出的其中一些建议是有代价的,所建议的方式会提升app的速度或者使它更加高效,但也可能需要花很多功夫去应用或者使代码变得更加复杂,所以要仔细选择。

  目录

  我要给出的建议将分为三个不同的等级: 入门级、 中级和进阶级:

  入门级(这是些你一定会经常用在你app开发中的建议)

  1. 用ARC管理内存

  2. 在正确的地方使用reuseIdentifier

  3. 尽可能使Views透明

  4. 避免庞大的XIB

  5. 不要block主线程

  6. 在Image Views中调整图片大小

  7. 选择正确的Collection

  8. 打开gzip压缩

  中级(这些是你可能在一些相对复杂情况下可能用到的)

  9. 重用和延迟加载Views

  10. Cache, Cache, 还是Cache!

  11. 权衡渲染方法

  12. 处理内存警告

  13. 重用大开销的对象

  14. 使用Sprite Sheets

  15. 避免反复处理数据

  16. 选择正确的数据格式

  17. 正确地设定Background Images

  18. 减少使用Web特性

  19. 设定Shadow Path

  20. 优化你的Table View

  21. 选择正确的数据存储选项

  进阶级(这些建议只应该在你确信他们可以解决问题和得心应手的情况下采用)

  22. 加速启动时间

  23. 使用Autorelease Pool

  24. 选择是否缓存图片

  25. 尽量避免日期格式转换

  无需赘述,让我们进入正题吧~

  初学者性能提升

  这个部分致力于一些能提高性能的基本改变。但所有层次的开发者都有可能会从这个记录了一些被忽视的项目的小小的性能备忘录里获得一些提升。

  1. 用ARC管理内存

  ARC(Automatic Reference Counting, 自动引用计数)和iOS5一起发布,它避免了常见的也是经常是由于我们忘记释放内存所造成的内存泄露。它自动为你管理retain和release的过程,所以你不必去手动干预了。

  下面是你会经常用来去创建一个View的代码段:

 
UIView *view = [[UIView alloc] init];
 // ...
 [self.view addSubview:view];
 [view release];

  忘掉代码段结尾的release简直像记得吃饭一样简单。而ARC会自动在底层为你做这些工作。

  除了帮你避免内存泄露,ARC还可以帮你提高性能,它能保证释放掉不再需要的对象的内存。这都啥年代了,你应该在你的所有项目里使用ARC!

  这里有一些更多关于ARC的学习资源:

  Apple’s official documentation

  Matthijs Hollemans’s Beginning ARC in iOS Tutorial

  Tony Dahbura’s How To Enable ARC in a Cocos2D 2.X Project

  If you still aren’t convinced of the benefits of ARC, check out this article on eight myths about ARC to really convince you why you should be using it!

  ARC当然不能为你排除所有内存泄露的可能性。由于阻塞, retain 周期, 管理不完善的CoreFoundation object(还有C结构)或者是代码太烂依然能导致内存泄露。

  这里有一篇很棒的介绍ARC不能做到以及我们该怎么做的文章 http://conradstoll.com/blog/2013/1/19/blocks-operations-and-retain-cycles.html。

  2. 在正确的地方使用 reuseIdentifier

  一个开发中常见的错误是没有给UITableViewCells, UICollectionViewCells,甚至是UITableViewHeaderFooterViews设置正确的reuseIdentifier。

  为了性能优化,table view用 `tableView:cellForRowAtIndexPath:` 为rows分配cells的时候,它的数据应该重用自UITableViewCell。 一个table view维持一个队列的数据可重用的UITableViewCell对象。