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。

  在程序中,如果选择使用SQLite,这里有个方便的库FMDB :可以利用该库操作SQLite数据库,而不用深入使用SQLite C API。