25个加强iOS应用程序性能的提示和技巧--高级篇

在开发iOS应用程序时,让程序具备良好的性能是很是关键的。这也是用户所指望的,若是你的程序运行迟钝或缓慢,会招致用户的差评。然而因为iOS设备的局限性,有时候要想得到良好的性能,是很困难的。在开发过程当中,有许多事项须要记住,而且关于性能影响很容易就忘记。本文收集了25个关于能够提高程序性能的提示和技巧。分为3个不一样的等级:初级、中级和高级: html

 

高级
当且仅当下面这些技巧可以解决问题的时候,才使用它们: ios

22.加速启动时间
23.使用Autorelease Pool
24.缓存图片 — 或者不缓存
25.尽可能避免Date格式化 缓存

 

高级性能提高 性能优化

寻找一些高明的方法,让本身变为一个全代码忍者?下面这些高级的性能优化技巧能够在适当的时候让程序尽量的高效运行! 网络

 

22) 加速启动时间 app

能快速的启动程序很是重要,特别是在用户第一次启动程序时。第一映像对程序来讲很是重要! iphone

 

让程序尽可能快速启动的方法就是尽可能以异步方式执行任务,例如网络请求,数据访问或解析。 异步

 

另外,避免使用臃肿的XIBs,由于XIB的加载是在主线程中进行的。可是记住storyboard没有这样的问题——因此若是能够的话就使用storyboard吧! ide

 

注意:在利用Xcode进行调试时,watchdog不会运行,所在设备中测试程序启动性能时,不要将设备链接到Xcode。 函数


23) 使用Autorelease Pool

NSAutoreleasePool负责释放一个代码块中的自动释放对象。通常都是由UIKit来建立的。不过有些状况下须要手动建立NSAutoreleasePool。

 

例如,若是在代码中建立了大量的临时对象,你将注意到内存使用量在增长,直到这些对象被释放。问题是只有当UIKit耗尽了 autorelease pool,这些对象才会被释放,也就是说当再也不须要这些对象以后,这些对象还在内存中占据着资源。

 

不过这个问题彻底能够避免:在@autoreleasepool代码块中建立临时对象,以下代码:

 
  1. NSArray *urls = <# An array of file URLs #>;  
  2. for (NSURL *url in urls) {  
  3.     @autoreleasepool {  
  4.         NSError *error;  
  5.         NSString *fileContents = [NSString stringWithContentsOfURL:url  
  6.                                          encoding:NSUTF8StringEncoding error:&error];  
  7.         /* Process the string, creating and autoreleasing more objects. */ 
  8.     }  

当每次迭代完以后,都会释放全部的autorelease对象。

 

关于NSAutoreleasePool的更多内容能够阅读苹果的官方文档


24) 缓存图片--或者不缓存

iOS中从程序bundle中加载UIImage通常有两种方法。

第一种比较常见:imageNamed。

第二种方法不多使用:imageWithContentsOfFile

 

为何有两种方法完成一样的事情呢?imageNamed的优势在于能够缓存已经加载的图片。苹果的文档中有以下说法:

This method looks in the system caches for an image object with the specified name and returns that object if it exists. If a matching image object is not already in the cache, this method loads the image data from the specified file, caches it, and then returns the resulting object.

 

这种方法会在系统缓存中根据指定的名字寻找图片,若是找到了就返回。若是没有在缓存中找到图片,该方法会从指定的文件中加载图片数据,并将其缓存起来,而后再把结果返回。

 

而imageWithContentsOfFile方法只是简单的加载图片,并不会将图片缓存起来。这两个方法的使用方法以下:

 
  1. UIImage *img = [UIImage imageNamed:@"myImage"]; // caching  
  2. // or  
  3. UIImage *img = [UIImage imageWithContentsOfFile:@"myImage"]; // no caching 

 那么该如何选择呢?

 

若是加载一张很大的图片,而且只使用一次,那么就不须要缓存这个图片。这种状况imageWithContentsOfFile比较合适——系统不会浪费内存来缓存图片。

 

然而,若是在程序中常常须要重用的图片,那么最好是选择imageNamed方法。这种方法能够节省出每次都从磁盘加载图片的时间。


25) 尽可能避免Date格式化
若是有许多日期须要使用NSDateFormatter,那么须要当心对待了。如以前(重用花销很大的对象)所提到的,不管何时,都应该尽可能重用NSDateFormatters。

 

然而,若是你须要更快的速度,那么应该使用C来直接解析日期,而不是NSDateFormatter。Sam Soffes写了一篇文章,其中提供了一些解析ISO-8601格式日期字符的串代码。你只须要简单的调整一下其中的代码就能够知足本身特殊的需求了。

 

这听起来不错把——不过,你相信这还有更好的一个办法吗?

 

若是你本身能控制处理日期的格式,那么能够选择 Unix timestamps(http://en.wikipedia.org/wiki/Unix_time)。Unix timestamps是一个简单的整数,表明了重新纪元时间(epoch)开始到如今已通过了多少秒,一般这个新纪元参考时间是00:00:00 UTC on 1 January 1970。

 

你能够很容易的见这个时间戳转换为NSDate,以下所示:

 
  1. - (NSDate*)dateFromUnixTimestamp:(NSTimeInterval)timestamp {  
  2.     return [NSDate dateWithTimeIntervalSince1970:timestamp];  

上面这个方法比C函数还要快!

 

注意:许多网络APIs返回的时间戳都是毫秒,所以须要注意的是在将这个时间戳传递给dateFromUnixTimestamp以前须要除以1000。

 

何去何从?
强烈建议对程序性能优化感兴趣的读者看看下面列出来的WWDC视频。在看视频以前,你须要注册一个Apple ID(注册后就能够观看全部WWDC2012的视频):

#406: Adopting Automatic Reference Counting
#238: iOS App Performance: Graphics and Animations
#242: iOS App Performance: Memory
#235: iOS App Performance: Responsiveness
#409: Learning Instruments
#706: Networking Best Practices
#514: OpenGL ES Tools and Techniques
#506: Optimizing 2D Graphics and Animation Performance
#601: Optimizing Web Content in UIWebViews and Websites on iOS
#225: Up and Running: Making a Great Impression with Every Launch


下面这些视频来自WWDC 2011 ,也很是有用:

#308: Blocks and Grand Central Dispatch in Practice
#323: Introducing Automatic Reference Counting
#312: iOS Performance and Power Optimization with Instruments
#105: Polishing Your App: Tips and tricks to improve the responsiveness and performance
#121: Understanding UIKit Rendering

 

这里还有更多相关视频,大多数来自iOS 5技术讲座

Optimizing App Performance with Instruments
Understanding iOS View Compositing


基于 “Your iOS App Performance Hitlist” 视频,Ole Begemann写了一篇文章。苹果还提供了一篇很是好的文章:性能优化。其中提供的技巧和提示对程序性能提高颇有帮助。

相关文章
相关标签/搜索