iOS应用程序性能的提示和技巧 — 初级篇

发表于:2013-05-08来源:破船之家作者:BeyondVincent点击数: 标签:iOS
在开发iOS应用程序时,让程序具有良好的性能是非常关键的。这也是用户所期望的,如果你的程序运行迟钝或缓慢,会招致用户的差评。

  在开发iOS应用程序时,让程序具有良好的性能是非常关键的。这也是用户所期望的,如果你的程序运行迟钝或缓慢,会招致用户的差评。

  然而由于iOS设备的局限性,有时候要想获得良好的性能,是很困难的。在开发过程中,有许多事项需要记住,并且关于性能影响很容易就忘记。

  这就是为什么我要写这篇文章!本文收集了25个关于可以提升程序性能的提示和技巧。

  目录

  我把性能优化技巧分为3个不同的等级:初级、中级和高级:

  初级

  在开发过程中,下面这些初级技巧需要时刻注意:

  使用ARC进行内存管理

  在适当的情况下使用reuseIdentifier

  尽可能将View设置为不透明(Opaque)

  避免臃肿的XIBs

  不要阻塞主线程

  让图片的大小跟UIImageView一样

  选择正确的集合

  使用GZIP压缩

  初级性能提升

  本部分内容介绍几本的程序性能提升技巧。其实所有级别的开发者都能从中获益。

  1) 使用ARC进行内存管理

  ARC是在iOS 5中发布的,它解决了最常见的内存泄露问题——也是开发者最容易健忘的。

  ARC的全称是“Automatic Reference Counting”——自动引用计数,它会自动的在代码中做retain/release工作,开发者不用再手动处理。

  下面是创建一个View通用的一些代码块:

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

  在上面代码结束的地方很容易会忘记调用release。不过当使用ARC时,ARC会在后台自动的帮你调用release。

  ARC除了能避免内存泄露外,还有助于程序性能的提升:当程序中的对象不再需要的时候,ARC会自动销毁对象。所以,你应该在工程中使用ARC。

  下面是一些学习ARC很棒的一些资源:

  苹果的官方文档

  Matthijs Hollemans的初级ARC

  Tony Dahbura的如何在Cocos2D 2.X工程中使用ARC

  如果你仍然不确定ARC带来的好处,那么看一些这篇文章:8个关于ARC的神话——这能够让你相信你应该在工程中使用ARC!

  值得注意的是,ARC并不能避免所有的内存泄露。使用ARC之后,工程中可能还会有内存泄露,不过引起这些内存泄露的主要原因是:block,retain循环,对CoreFoundation对象(通常是C结构)管理不善,以及真的是代码没写好。

  这里有一篇文章是介绍哪些问题是ARC不能解决的 — 以及如何处理这些问题。

  2) 在适当的情况下使用reuseIdentifier

  在适当的情况使用reuseIdentifier

  在iOS程序开发中一个普遍性的错误就是没有正确的为UITableViewCells、UICollectionViewCells和UITableViewHeaderFooterViews设置reuseIdentifier。

  为了获得最佳性能,当在tableView:cellForRowAtIndexPath:方法中返回cell时,table view的数据源一般会重用UITableViewCell对象。table view维护着UITableViewCell对象的一个队列或者列表,这些数据源已经被标记为重用了。

  如果没有使用reuseIdentifier会发生什么?

  如果你在程序中没有使用reuseIdentifier,table view每次显示一个row时,都会配置一个全新的cell。这其实是一个非常消耗资源的操作,并且会影响程序中table view滚动的效率。

  自iOS 6以来,你可能还希望header和footer views,以及UICollectionView的cell和supplementary views。

  为了使用reuseIdentifiers,在table view请求一个新的cell时,在数据源中调用下面的方法:

  static NSString *CellIdentifier = @"Cell";UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];

  如果table view维护的UITableViewCell队列或列表中有可用的cell,则从队列从移除一个已经存在的cell,如果没有的话,就从之前注册的nib文件或类中创建一个新的cell。如果没有可以重用的cell,并且没有注册nib文件或类,tableview的dequeueReusableCellWithIdentifier:方法会返回一个nil。

  3) 尽可能将View设置为不透明(Opaque)

  尽量将view设置为Opaque

  如果view是不透明的,那么应该将其opaque属性设置为YES。

  为什么要这样做呢?这样设置可以让系统以最优的方式来绘制view。opaque属性可以在Interface Builder或代码中设置。

  苹果的官方文档对opaque属性有如下解释:

  This property provides a hint to the drawing system as to how it should treat the view. If set to YES, the drawing system treats the view as fully opaque, which allows the drawing system to optimize some drawing operations and improve performance. If set to NO, the drawing system composites the view normally with other content. The default value of this property is YES.

  (opaque属性提示绘制系统如何处理view。如果opaque设置为YES,绘图系统会将view看为完全不透明,这样绘图系统就可以优化一些绘制操作以提升性能。如果设置为NO,那么绘图系统结合其它内容来处理view。默认情况下,这个属性是YES。)

  如果屏幕是静止的,那么这个opaque属性的设置与否不是一个大问题。但是,如果view是嵌入到scroll view中的,或者是复杂动画的一部分,不将设置这个属性的话肯定会影响程序的性能!

  可以通过模拟器的Debug\Color Blended Layers选项来查看哪些view没有设置为不透明。为了程序的性能,尽可能的将view设置为不透明!

原文转自:http://beyondvincent.com/2013/04/06/25%e4%b8%aa%e5%a2%9e%e5%bc%baios%e5%ba%94%e7%94%a8%e7%a8%8b%e5%ba%8f%e6%80%a7%e8%83%bd%e7%9a%84%e6%8f%90%e7%a4%ba%e5%92%8c%e6%8a%80%e5%b7%a7-%e5%88%9d%e7%ba%a7%e7%af%87/