iOS应用程序性能的提示和技巧 — 中级篇(3)

发表于:2013-05-08来源:破船之家作者:BeyondVincent点击数: 标签:iOS
在iOS编码中,跟别的许多东西类似,这里也有两种方法来给view设置一个背景图片: 可以使用UIColor的colorWithPatternImge方法来创建一个颜色,并将这个颜色设

  在iOS编码中,跟别的许多东西类似,这里也有两种方法来给view设置一个背景图片:

  可以使用UIColor的colorWithPatternImge方法来创建一个颜色,并将这个颜色设置为view的背景颜色。

  可以给view添加一个UIImageView子视图。

  如果你有一个全尺寸的背景图片,那么应该使用UIImageView,因为UIColor的colorWithPatternImge方法是用来创建小图片的——该图片会被重复使用。此时使用UIImageView会节省很多内存。

  // You could also achieve the same result in Interface BuilderUIImageView *backgroundView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"background"]];[self.view addSubview:backgroundView];

  不过,如果你计划用小图片当做背景,那么应该使用UIColor的colorWithPatternImge方法。这种情况下绘制速度会很快,并且不会消耗大量的内存。

  self.view.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"background"]];

  18) 降低Web内容的影响

  UIWebView非常有用。用它可以很容易的显示web内容,甚至可以构建UIKit空间难以显示的内容。

  不过,你可以能已经注意到程序中使用的UIWebView组建没有苹果的Safari程序快。这是因为JIT编译限制了WebKit的Nitro引擎的使用。

  因此为了获得更加的性能,需要调整一下HTML的大小。首先就是尽量的摆脱JavaScript,并避免使用大的矿建,例如jQuery。有时候使用原始的JavaScript要比别的框架快。

  另外,尽量的异步加载JavaScript文件——特别是不直接影响到页面行为时,例如分析脚本。

  最后——让使用到的图片,跟实际需要的一样大小。如之前提到的,尽量使用sprite sheets,以此节省内存和提升速度。

  更多相关信息,可以看一下: WWDC 2012 session #601 – 在iOS中优化UIWebView和网站中的Web内容。

  19) 设置阴影路径

  如果需要在view活layer中添加一个阴影,该如何处理呢?

  大多数开发者首先将QuartzCore框架添加到工程中,然后添加如下代码:

  #import <QuartzCore/QuartzCore.h> // Somewhere later ...UIView *view = [[UIView alloc] init]; // Setup the shadow ...view.layer.shadowOffset = CGSizeMake(-1.0f, 1.0f);view.layer.shadowRadius = 5.0f;view.layer.shadowOpacity = 0.6;

  看起来非常容易,不是吗?

  然而不幸的是上面这种方法有一个问题。Core Animation在渲染阴影效果之前,必须通过做一个离屏(offscreen)才能确定view的形状,而这个离屏操作非常耗费资源。

  下面有一种方法可以更容易的让系统进行阴影渲染:设置阴影路径!

  view.layer.shadowPath = [[UIBezierPath bezierPathWithRect:view.bounds] CGPath];

  通过设置阴影路径,iOS就不用总是再计算该如何绘制阴影了。只需要使用你预先计算好的路径即可。有一点不好的是,根据view的格式,自己可能很难计算出路径。另外一个问题就是当view的frame改变时,必须每次都更新一下阴影路径。

  如果你想了解更多相关信息,Mark Pospesel写了一篇很棒的文章:shadowPath。

  20) 优化TableView

  Table views需要快速的滚动——如果不能的话,用户会感觉到停顿。

  为了让table view平滑的滚动,确保遵循了如下建议:

  设置正确的reuseIdentifer以重用cell。

  尽量将view设置为不透明,包括cell本身。

  避免渐变,图像缩放以及离屏绘制。

  如果row的高度不相同,那么将其缓存下来。

  如果cell显示的内容来此网络,那么确保这些内容是通过异步来获取的。

  使用shadowPath来设置阴影。

  减少subview的数量。

  在cellForRowAtIndexPath:中尽量做更少的操作。如果需要做一些处理,那么最好做过一次之后,就将结果缓存起来。

  使用适当的数据结构来保存需要的信息。不同的结构会带来不同的操作代价。

  使用rowHeight, sectionFooterHeight 和 sectionHeaderHeight 来设置一个恒定 高度,而不要从delegate中获取。

  21) 选择正确的数据存储方式

  选择正确的数据存储方式

  当需要存储和读取大量的数据时,该如何选择存储方式呢?

  有如下选择:

  使用NSUserDefaults进行存储

  保存为XML,JSON或Plist格式的文件

  利用NSCoding进行归档

  存储到一个本地数据库,例如SQLite。

  使用Core Data.

  使用NSUserDefaults有什么问题呢? 虽然NSUserDefaults很好并且容易,不过只只针对于存储小量数据(比如你的级别,或者声音是开或关)。如果要存储大量的数据,最好选择别的存储方式。

  大量数据保存为结构化的文件也可能会带来问题。一般,在解析这些结构数据之前,需要将内容全部加载到内存中,这是很消耗资源的。虽然可以使用SAX来处理XML文件,但是这有点复杂。另外,加载到内存中的所有对象,不一定全部都需要用到。

  那么使用NSCoding来保存大量数据怎么样呢?因为它同样是对文件进行读写,因此依然存在上面说的问题。

  要保存大量的数据,最好使用SQLite或Core Data。通过SQLite或Core Data可以进行具体的查询——只需要获取并加载需要的数据对象——避免对数据进行不合理的搜索。在性能方面,SQLite和Core Data差不大。

  SQLite和Core Data最大的区别实际上就是用法上。Core Data代表一个对象模型,而SQLite只是一个DBMS。一般,苹果建议使用Core Data,不过如果你有特殊的原因不能使用Core Data的话,可以使用低级别的SQLite。

原文转自:http://beyondvincent.com/2013/04/11/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-%E4%B8%AD%E7%BA%A7%E7%AF%87/