在开发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的大小。