在开发iOS应用程序时,让程序具有良好的性能是非常关键的。这也是用户所期望的,如果你的程序运行迟钝或缓慢,会招致用户的差评。然而由于iOS设备的局限性,有时候要想获得良好的性能,是很困难的。在开发过程中,有许多事项需要记住,并且关于性能影响很容易就忘记。本文收集了25个关于可以提升程序性能的提示和技巧。分为3个不同的等级:初级、中级和高级:

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

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

高级性能提升

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

22) 加速启动时间

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

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

另外,避免使用臃肿的XIBs,因为XIB的加载是在主线程中进行的。但是记住storyboard没有这样的问题——所以如果可以的话就使用storyboard吧!

注意:在利用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. }

  9. }

当每次迭代完之后,都会释放所有的autorelease对象。

关于NSAutoreleasePool的更多内容可以阅读苹果的官方文档。

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

iOS中从程序bundle中加载UIImage一般有两种方法。

第一种比较常见:p_w_picpathNamed。

第二种方法很少使用:p_w_picpathWithContentsOfFile

为什么有两种方法完成同样的事情呢?p_w_picpathNamed的优点在于可以缓存已经加载的图片。苹果的文档中有如下说法:

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

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

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

  1. UIImage *img = [UIImage p_w_picpathNamed:@"myImage"]; // caching

  2. // or

  3. UIImage *img = [UIImage p_w_picpathWithContentsOfFile:@"myImage"]; // no caching

那么该如何选择呢?

如果加载一张很大的图片,并且只使用一次,那么就不需要缓存这个图片。这种情况p_w_picpathWithContentsOfFile比较合适——系统不会浪费内存来缓存图片。

然而,如果在程序中经常需要重用的图片,那么最好是选择p_w_picpathNamed方法。这种方法可以节省出每次都从磁盘加载图片的时间。

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];

  3. }

上面这个方法比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写了一篇文章。苹果还提供了一篇非常好的文章:性能优化。其中提供的技巧和提示对程序性能提升很有帮助。

来源:破船的博客

转载于:https://blog.51cto.com/roybaby/1219616

25个增强iOS应用程序性能的提示和技巧--高级篇相关推荐

  1. [转]25个增强iOS应用程序性能的提示和技巧 — 高级篇

    _____________ 转自:BeyondVincent的博客 _____________ 在开发iOS应用程序时,让程序具有良好的性能是非常关键的.这也是用户所期望的,如果你的程序运行迟钝或缓慢 ...

  2. 25个增强iOS应用程序性能的提示和技巧 — 中级篇

    本文由破船译自:raywenderlich 转载请注明出处:BeyondVincent的博客 _____________ 在开发iOS应用程序时.让程序具有良好的性能是非常关键的.这也是用户所期望的. ...

  3. [转]25个增强iOS应用程序性能的提示和技巧

    在开发iOS应用程序时,让程序具有良好的性能是非常关键的.这也是用户所期望的,如果你的程序运行迟钝或缓慢,会招致用户的差评.然而由于iOS设备的局限性,有时候要想获得良好的性能,是很困难的.在开发过程 ...

  4. 第25课:优化应用程序性能,好钢用在刀刃上

    本节课,我们来讨论一下影响应用程序性能的不同方面,并针对性地提出优化应用程序性能的常用手段. 我们将从以下几个方面分别进行讨论: 优化网络性能 优化文件访问性能 优化内存使用性能 优化 CPU 使用性 ...

  5. 程序员C语言快速上手——高级篇(十)

    文章目录 高级篇 内存管理 内存四区 内存分配 动态内存管理 指针高级 二维数组 二级指针 函数指针 函数指针的声明 函数指针的赋值与使用 函数指针的传递 void*指针 欢迎关注我的公众号:编程之路 ...

  6. 程序猿必备技能之MySQL高级篇

      MySQL是我们非常常用的关系型数据库,非常重要,所以在这里给大家整理下MySQL的高级内容. 1. MySQL高级特性 1.1. MySQL体系结构 Client Connectors: 接入方 ...

  7. php foreach id是否存在数组_45个PHP程序性能优化的小技巧,赶紧收藏吧

    在我们平常写代码的过程中,除了数据库的优化,针对与文件的优化,我们还需要对PHP执行优化. 在项目开发过程中,我们经常会遇到了一些PHP处理程序性能低下的情况,程序运行在centos+nginx环境, ...

  8. 提高WPF程序性能的几条建议

    原文:提高WPF程序性能的几条建议 这篇博客将介绍一些提高WPF程序的建议(水平有限,如果建议有误,请指正.) 1. 加快WPF程序的启动速度: (1).减少需要显示的元素数量,去除不需要或者冗余的X ...

  9. 11个显著提升 ASP.NET 应用程序性能的技巧——第1部分

    2019独角兽企业重金招聘Python工程师标准>>> [编者按]本文出自站外作者 Brij Bhushan Mishra ,Brij 是微软 MVP-ASP.NET/IIS.C# ...

最新文章

  1. Access denied for user(这个几乎让我怀疑人生的异常)
  2. Android开发笔记之:Log图文详解(Log.v,Log.d,Log.i,Log.w,Log.e)
  3. 超级菜鸟如何入门数据分析?
  4. IDEA 每次运行项目时都提示源值1.5已过时,将在未来所有版本中删除
  5. python 桌面提醒_使用Python获取桌面通知
  6. 定时器和promise_从Promise链理解EventLoop
  7. python文本提取序列信息_从fasta文件中通过头中的ID号提取序列
  8. javascript中字符串常用方法
  9. Silverlight 4简体中文正式版脱机帮助文档下载
  10. iphone:解析html的第三库hpple初试
  11. linux mysql 建索引_MySQL在创建索引之前一定要想到的事情
  12. 【风电功率预测】基于matlab粒子群算法优化LSTM风电功率预测【含Matlab源码 941期】
  13. Android布局——小米便签编辑界面xml
  14. 百度网盘linux微博登录,百度网盘,微博登录
  15. 无法访问共享计算机文件,电脑无法访问共享文件怎么解决?
  16. Swing绝对布局之setBounds
  17. arc 093 F Dark Horse
  18. 零基础使用Xmind
  19. html包zip有错误是什么意思,解压缩文件出现错误是什么回事
  20. 你创业为什么会失败?

热门文章

  1. 使用System Center Essentials 2007进行软件部署
  2. Shadow Map 原理和改进 【转】
  3. eventlog analyzer 8.0
  4. [LeetCode] Surrounded Regions, Solution
  5. heX:用HTML5和Node.JS开发桌面应用
  6. 像孙正义为了练英语坚决不说日语一样。我也应该有坚决不看中文文档的心!...
  7. 简单手绘背景绘画过程-------树!
  8. c# Aspose.Words插入饼图PieChart
  9. C#生成不重复随机数列表
  10. Kendo UI开发教程(25): 单页面应用(三) View