本文来自Movile的iOS程序员iOSTutorialTeam的MarceloFabri。这是他的个人网站:http://www.marcelofabri.com/您也可以在Twitter上关注@marcelofabri_。性能对于iOS应用程序开发尤为重要,如果您的应用程序反应迟钝或速度慢,失望的用户将用他们的失望填满AppStore评论。然而,由于iOS设备的限制,有时很难获得正确的性能。开发中需要注意的地方很多,选择时容易忘记考虑性能影响。这就是我写这篇文章的原因。本文将25个提示和技巧汇集在一个易于查看的清单中,您可以使用它们来提高应用程序的性能。请耐心阅读本文,为您未来的应用提速!注意:在优化代码之前,一定要注意一个问题,不要养成“预优化”代码的错误习惯。不时使用Instruments分析您的代码,以发现需要改进的地方。MattGalloway写了一篇关于如何使用Instruments优化代码的好文章。另请注意,此处列出的一些建议是有代价的,建议的方法会加快您的应用程序或使其更高效,但也可能需要花费大量精力才能应用或使代码更复杂,因此请谨慎选择。目录我要给出的建议将分为三个不同的级别:入门级、中级和高级:入门级(这是您在应用程序开发中肯定会使用的一些建议)1.使用ARC2管理内存.在正确的地方使用reuseIdentifier3.使视图尽可能透明4.避免巨大的XIB5.不要阻塞主线程6.在图像视图中调整图像大小7.选择正确的集合8.打开gzip压缩中间级别(这些是你可能会在一些相对复杂的情况下使用它)9.重用和延迟加载视图10.缓存,缓存,还是缓存!11.权衡渲染方法12.处理内存警告13.重用昂贵的对象14.使用SpriteSheets15.避免重新处理数据16.选择正确的数据格式17.正确设置背景图像18.减少Web功能的使用19.设置ShadowPath20.优化你的TableView21.选择合适的数据存储选项Advanced(这些建议只有当你确定它们会解决问题并且得心应手时才应该使用)22.加快启动时间23.使用AutoreleasePool24.选择是否缓存图片25.尽量避免日期格式转换不用赘述,进入正题~初级性能提升这部分专门介绍一些可以提升性能的基础改动。但是,所有级别的开发人员都可能会从这个记录了一些被忽视项目的小性能备忘录中得到一些提升。1、使用ARC管理内存ARC(AutomaticReferenceCounting,自动引用计数)是随着iOS5一起发布的,避免了我们经常忘记释放内存而导致的最常见的内存泄漏。它会自动为您管理保留和发布过程,因此您无需手动干预。以下是您经常用来创建视图的代码片段:UIView*view=[[UIViewalloc]init];//...[self.viewaddSubview:view];[viewrelease];忘记代码片段末尾的发布就像记住吃饭一样简单。ARC会在后台自动为您完成这项工作。除了帮助您避免内存泄漏之外,ARC还可以通过确保释放不再需要的对象的内存来帮助您提高性能。这是时代,您应该在所有项目中使用ARC!这里有更多学习ARC的资源:Apple的官方文档MatthijsHollemans的BeginningARCiniOSTutorialTonyDahbura的如何在Cocos2D2.X项目中启用ARC如果您仍然不相信ARC的好处,请查看这篇关于ARC的八个神话真正说服了你为什么要使用它!ARC当然不能为您排除所有内存泄漏。由于阻塞、循环保留、管理不善的CoreFoundation对象(和C结构)或简单的错误代码仍然会导致内存泄漏。这是一篇关于ARC不能做什么以及我们如何做到的好文章http://conradstoll.com/blog/2013/1/19/blocks-operations-and-retain-cycles.html。2.在正确的地方使用reuseIdentifier开发中的一个常见错误是没有为UITableViewCells、UICollectionViewCells,甚至UITableViewHeaderFooterViews设置正确的reuseIdentifier。为了性能优化,当表视图使用tableView:cellForRowAtIndexPath:将单元格分配给行时,它的数据应该从UITableViewCell中重用。表视图维护一个数据队列,可重用UITableViewCell对象。如果不使用reuseIdentifier,则每次显示一行表视图时都必须设置一个新的单元格。对性能的影响会相当大,尤其是应用的滚动体验会大大降低。从iOS6开始,除了UICollectionView单元格和补充视图之外,您还应该在页眉和页脚视图中使用reuseIdentifiers。如果要使用reuseIdentifiers,在向表视图添加新单元格时,将此方法添加到数据源对象:此方法使那些已经存在的单元格出列,或者在必要时使用先前注册的笔尖或类创建新单元格。如果没有可重用的单元格并且您还没有注册类或nib,则此方法返回nil。3.尝试将视图设置为透明。如果你有透明的视图,你应该将它们的不透明属性设置为YES。原因是这将导致系统以最佳方式呈现这些视图。这个简单的属性可以在IB或代码中设置。Apple的文档描述了如何设置图像的透明度属性:(不透明)此属性向渲染系统提供了如何处理视图的提示。如果设置为YES,渲染系统认为view是完全不透明的,这样渲染系统可以优化一些渲染过程,提高性能。如果设置为NO,渲染系统将View与其他内容正常组合。默认值为是。在相对静态的图像中,设置该属性不会有太大的效果。但是,当此视图嵌入到滚动视图中,或者是复杂动画的一部分时,不设置此属性会极大地影响应用程序的性能。您可以使用模拟器中的DebugColorBlendedLayers选项找出哪些视图未设置为不透明。目标是将所有不透明的东西设置为不透明!4.避免过大的XIBStoryboards在iOS5中加入,正在迅速取代XIB。然而,XIB在某些情况下仍然有用。例如,如果你的应用程序需要适配iOS5之前的设备,或者你有一个自定义的可重用视图,你将不可避免地使用它们。如果您必须使用XIB,请使它们尽可能简单。尝试为每个Controller配置一个单独的XIB,尽可能将ViewController的视图层次结构分散到单独的XIB中。请注意,当您加载XIB时,所有内容都放在内存中,包括任何图像。如果您有一个不立即使用的视图,那么您就是在浪费宝贵的内存资源。故事板是另一回事,故事板仅在需要时实例化视图控制器。一旦进入XIB,所有图像都会被缓存,如果您正在进行OSX开发,那么声音文件也会被缓存。Apple在相关文档中的描述是:当你加载一个引用图片或声音资源的nib时,nib加载代码会将图片和声音文件写入内存。在OSX中,图像和声音资源缓存在命名缓存中以供将来访问。在iOS中,只有图像资源存储在命名缓存中。根据您的平台,使用imageNamed:NSImage或UIImage的方法来获取图像资源。显然故事板中也会发生同样的事情,但我还没有找到任何文档来支持这个结论。如果您知道此操作,请写信给我!要了解有关Storyboard的更多信息,您可以查看MatthijsHollemans撰写的BeginningStoryboardsiniOS5第1部分和第25部分。不要阻塞主线程,也不要让主线程负担过重。因为UIKit在主线程上完成了所有工作,渲染、管理触摸响应、响应输入等都需要在它上面完成。一直使用主线程的风险在于,如果您的代码确实阻塞了主线程,您的应用程序将变得无响应。这。..这是在AppStore中获得星标的捷径:]大多数情况下,当您的应用程序正在执行一些涉及读取或写入外部资源(如存储或网络)的I/O时,会阻塞主进程。您可以使用NSURLConnection:+(void)sendAsynchronousRequest:(NSURLRequest*)requestqueue:(NSOperationQueue*)queuecompletionHandler:(void(^)(NSURLResponse*,NSData*,NSError*))handler或使用类似AFNetworking框架的方式异步执行网络操作异步执行这些操作。如果你需要做其他类型的资源密集型操作(比如时间敏感的计算或存储读写),那么使用GrandCentralDispatch,或者NSOperation和NSOperationQueues。以下代码使用GCD模板Objective-Cdispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0),^{//switchtoabackgroundthreadandperformyourexpensiveoperationdispatch_async(dispatch_get_main_queue(),^{//switchbacktothemainthreadtoupdateyourUI});});在代码中发现嵌套的dispatch_async?这是因为任何与UIKit相关的代码都需要在主线程上运行。如果您对NSOperation或GCD的详细信息感兴趣,请查看RayWenderlich的多线程和GrandCentralDispatchoniOSforBeginners,以及SoheilAzarpour的如何使用NSOperations和NSOperationQueues教程。6.调整图像视图中的图像大小如果你想在UIImageView中显示bundle中的图像,你应该确保图像的大小与UIImageView的大小相同。动态缩放图像是资源密集型的,尤其是当UIImageView嵌套在UIScrollView中时。如果图片是从远程服务加载的,你无法控制图片的大小,比如在下载前调整到合适的大小,下载完成后可以使用后台线程缩放一次,然后使用放大UIImageView的图片。7、选择合适的CollectionLearning选择最适合业务场景的类或对象是编写节能代码的基础。在处理集合时尤其如此。Apple有一个CollectionsProgrammingTopics文档,其中详细说明了可用类之间的差异以及您应该在何处使用它们。对于任何使用集合的人来说,这是一本必读的书。呵呵,我就知道你没看是因为太长了……这里总结一些常见的集合:数组:一组有序的值。使用索引查找很快,使用值查找很慢,插入/删除很慢。字典:存储键值对。使用键查找速度更快。集合:一组无序的值。按值查找很快,插入/删除也很快。8.开启gzip压缩大量APP依赖远程资源和第三方API。您可能开发了一个应用程序,需要从远程下载XML、JSON、HTML或其他格式。问题是我们的目标是移动设备,因此您不能指望良好的网络。仍在边缘网络的用户可能会在下一分钟切换到3G。无论情况如何,您都不想让用户等待太久。减小文件大小的一种方法是在服务器和您的应用程序中启用gzip。这对于可以具有更高压缩率的数据(例如文本)会更有效。好消息是iOS已经默认支持NSURLConnection中的gzip压缩,当然还有基于它的AFNetworking框架。GoogleAppEngine等云服务提供商已经支持压缩输出。如果您不知道如何使用Apache或IIS(服务器)打开gzip,可以阅读本文。
