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

发表于:2013-05-08来源:破船之家作者:BeyondVincent点击数: 标签:iOS
4) 避免臃肿的XIBs 避免臃肿的XIBs 在iOS 5中开始使用Storyboards,并且将替代XIBs。不过在有些情况下XIBs仍然有用。如果你的程序需要运行在装有iOS 5之前版本的

  4) 避免臃肿的XIBs

  避免臃肿的XIBs

  在iOS 5中开始使用Storyboards,并且将替代XIBs。不过在有些情况下XIBs仍然有用。如果你的程序需要运行在装有iOS 5之前版本的设备上,或者要自定义可重用的view,那么是避免不了要使用XIBs的。

  如果必须要使用XIBs的话,尽量让XIBs文件简单。并且每个view controller对于一个XIB文件,如果可以的话,把一个view controller的view不同的层次单独分到一个XIBs文件中。

  注意:当把一个XIB文件加载到内存时,XIB文件中的所有内容都将被加载到内存中,包括图片。如果有一个view还不立即使用的话,就会造成内存的浪费。而这在storyboard中是不会发生的,因为storyboard还在需要的时候才实例化一个view controller。

  当加载XIB时,所有涉及到的图片都将被缓存,并且如果是开发的程序是针对OS X的话,声音文件也会被加载。苹果的官方文档这样说:

  When you load a nib file that contains references to image or sound resources, the nib-loading code reads the actual image or sound file into memory and and caches it. In OS X, image and sound resources are stored in named caches so that you can access them later if needed. In iOS, only image resources are stored in named caches. To access images, you use the imageNamed: method of NSImage or UIImage, depending on your platform.

  (当加载一个nib文件时,也会将nib文件涉及到的图片或声音资源加载到内存中,nib-loading代码会将实际的图片或声音文件读取到内存中,并一直缓存着。在OS X中,图片和声音资源都存储在命名缓存中,这样之后如果需要的话,可以对其进行访问。在iOS中,只有图片资源被存储到命名缓存中。要访问图片的话,使用NSImage或UIImage(根据不同的系统)的imageNamed:方法即可。)

  显然,在使用storyboard时也会发生类似的缓存操作;不过我没有找到相关内容的任何资料。如果你知道的话,可以告诉我哦!

  想要学习storyboard的更多知识吗?可以看看Matthijs Hollemans写的iOS 5中:初级Storyboard Part 1和Part2。

  5) 不要阻塞主线程

  不要阻塞主线程

  永远都不要在主线程做繁重的任务。因为UIKit的任务都在主线程中进行,例如绘制、触摸管理和输入响应。

  在主线程做所有任务的风险是:如果你的代码阻塞了主线程,那么程序将出现反应迟钝。这回招致用户在App Store上对程序的差评!

  在执行I/O操作中,大多数情况下都会祖塞主线程,这些操作需要从读写外部资源,例如磁盘或者网络。

  关于网络操作可以使用NSURLConnection的如下方法,以异步的方式来执行:

  + (void)sendAsynchronousRequest:(NSURLRequest *)request queue:(NSOperationQueue *)queue completionHandler:(void (^)(NSURLResponse*, NSData*, NSError*))handler

  或者使用第三方框架,例如AFNetworking。

  如果你需要做一些其它类型开销很大的操作(例如执行一个时间密集型的计算或者对磁盘进行读写),那么就使用GCD(Grand Central Dispatch),或NSOperations 和 NSOperationQueues。

  下面的代码是使用GCD的一个模板

  dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ // switch to a background thread and perform your expensive operation dispatch_async(dispatch_get_main_queue(), ^{ // switch back to the main thread to update your UI });});

  如上代码,为什么在第一个dispatch_async里面还嵌套了一个dispatch_async呢?这是因为关于UIKit相关的代码需要在主线程里面执行。

  对NSOperation和GCD感到好奇吗?可以看看Ray Wenderlich中的教程:iOS中多线程和GCD—初级,以及Soheil Azarpour的如何使用NSOperations和NSOperationQueues教程。

  6) 让图片的大小跟UIImageView一样

  确保图片和UIImageView大小一致

  如果需要将程序bundle中的图片显示到UIImageView中,请确保图片和UIImageView的大小是一样的。因为图片的缩放非常耗费资源,特别是将UIImageView嵌入到UIScrollView中。

  如果是从远程服务中下载图片,有时候你控制不了图片的尺寸,或者在下载之前无法在服务器上进行图片的缩放。这种情况,当图片下载完之后,你可以手动进行图片的缩放——做好是在后台线程中!——然后再在UIImageView中使用缩放过的图片。

  7) 选择正确的集合

  选择正确的集合

  学习使用最适合的类或对象是编写高效代码的基础。特别是在处理集合数据时,尤为重要。

  苹果的官网上有一篇文章:集合编程主题(Collections Programming Topics)——详细的介绍了在集合数据中可以使用的类,以及什么情况下使用哪个类。在使用集合时,每个开发者都应该阅读一下这个文档。

  太长,不想阅读(TLDR)?下面是常见集合类型的一个简介:

  数组:是一个值按顺序排列的一个列表。根据索引可以快速查找,不过根据值进行查找就比较慢,另外插入和删除也比较慢。

  字典: 存储键/值对。根据键可以快速查找。

  Sets: 是一个值无序排列的列表,根据值可以快速查找,另外插入和删除也比较快。

  8) 使用GZIP压缩

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