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

发表于:2013-05-08来源:破船之家作者:BeyondVincent点击数: 标签:iOS
然而不幸的是上面这种方法有一个问题。Core Animation在渲染阴影效果之前,必须通过做一个离屏(offscreen)才能确定view的形状,而这个离屏操作非常耗费资源。

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

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

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

  目录

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

  中级

  在性能优化时,当你碰到一些复杂的问题,应该注意和使用如下技巧:

  重用和延迟加载View

  缓存、缓存、缓存

  考虑绘制

  处理内存警告

  重用花销很大的对象

  使用Sprite Sheets

  避免重新处理数据

  选择正确的数据格式

  设置适当的背景图片

  降低Web内容的影响

  设置阴影路径

  优化TableView

  选择正确的数据存储方式

  中级性能提升

  现在,在进行代码优化时,你已经能够完成一些初级性能优化了。但是下面还有另外一些优化方案,虽然可能不太明显(取决于程序的架构和相关代码),但是,如果能够正确的利用好这些方案,那么它们对性能的优化将非常明显!

  9) 重用和延迟加载View

  程序界面中包含更多的view,意味着界面在显示的时候,需要进行更多的绘制任务;也就意味着需要消耗更多的CPU和内存资源。特别是在一个UIScrollView里面加入了许多view。

  这种情况的管理技巧可以参考UITableView和UICollectionView的行为:不要一次性创建所有的subview,而是在需要的时候在创建view,并且当view使用完毕时候将它们添加到重用队列中。

  这样就可以仅在UIScrollView滚动的时候才配置view,以此可以避免分配创建view的带来的成本——这可能是非常耗资源的。

  现在有这样的一个问题:在程序中需要显示的view在什么时机创建(比如说,当用户点击某个按钮,需要显示某个view)。这里有两种可选方法:

  在屏幕第一次加载以及隐藏的时候,创建view;然后在需要的时候,再把view显示出来。

  直到需要显示view的时候,才创建并显示view。

  每种方法都有各自的优点和确定。

  使用第一种方法,需要消耗更多的内容,因为创建出来的view一直占据着内存,直到view被release掉。不过,使用这种方法,当用户点击按钮时,程序会很快的显示出view,因为只需要修改一下view的可见性即可。

  而使用第二种方法则产生相反的效果;当需要的时候猜创建view,这会消耗更少的内存;不过,当用户点击按钮的时候,不会立即显示出view。

  10) 缓存、缓存、缓存

  在开发程序时,一个重要的规则就是“缓存重要的内容”——这些内容一般不会改变,并且访问的频率比较高。

  可以缓存写什么内容呢?比如远程服务器的响应内容,图片,甚至是计算结果,比如UITableView的行高。

  NSURLConnection根据HTTP头的处理过程,已经把一些资源缓存到磁盘和内存中了。你甚至可以手动创建一个NSURLRequest ,让其只加载缓存的值。

  下面的代码片段一般用在为图片创建一个NSURLRequest:

  + (NSMutableURLRequest *)imageRequestWithURL:(NSURL *)url { NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; request.cachePolicy = NSURLRequestReturnCacheDataElseLoad; // this will make sure the request always returns the cached image request.HTTPShouldHandleCookies = NO; request.HTTPShouldUsePipelining = YES; [request addValue:@"image/*" forHTTPHeaderField:@"Accept"]; return request;}

  注意:你可以使用NSURLConnection抓取一个URL请求,但是同样可以使用AFNetworking来抓取,这种方法不用修改所有网络相关的代码——这是一个技巧!:]

  如果你要直到更多关于HTTP 缓存, NSURLCache, NSURLConnection 以及相关的内容, 那么看一下NSHipster中的the NSURLCache entry。

  如果你需要缓存的内容没涉及到HTTP请求,那么使用NSCache。

  NSCache的外观和行为与NSDictionary类似, 但是,当系统需要回收内存时,NSCache会自动的里面存储的内容。Mattt Thompson 在NSHipster上写了一篇关于NSCache非常不错的文章。

  如果还想知道关于HTTP缓存更多的内容,那么建议阅读一下Google的这篇文章:best-practices document on HTTP caching。

  11) 考虑绘制

  考虑绘制

  在iOS中制作漂亮的按钮有多种方法。可以使用全尺寸图片,可缩放图片,或者使用CALayer, CoreGraphics, 甚至是OpenGL来手动测量和绘制按钮。

  当然,这些方法的复杂程度也不同,并且性能也有所区别。这里有一篇相关文章值得阅读一下:关于iOS中图形的性能。其中Andy Matuschak(曾经是苹果的UIKit小组的组员)对这篇文章的评论中,对于不同的方法及其性能权衡有非常好的一个见解。

  简单来说,使用预渲染图片技术是最快的,因为iOS中不用等到在屏幕上显示的时候才创建图形和对形状进行绘制(图片已经创建好了!)。这样带来的问题是需要把所有的图片都放到程序bundle中,从而增加了程序的大小。因此使用可伸缩图片在这里将排上用场了:可以移除“浪费”空间的图片——iOS可以重复利用。并且针对不同的元素(例如按钮)不需要创建不同的图片。

  不过,使用图片的话会失去代码对图片的控制能力,进而针对不同的程序,就需要重复的生成每一个需要的图片,并反复的放到每个程序中。这个处理过程一般会比较慢。另外一点就是如果你需要一个动画,或者许多图片都要进行轻微的调整(比如多个颜色的覆盖),那么需要在程序中加入许多图片,进而增加了程序bundle的大小。

原文转自: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/