[翻译]iOS应用程序性能优化(摘要)

原文:iOS App Programming Guide / Performance Tuning

大致翻译了一下主要内容,难免有误,请留言指出。

iOS应用程序编程指南

性能优化

使应用程序备份更高效

应用程序备份最佳实践

iCloud和iTunes备份不包含以下目录:

  • <Application_Home>/AppName.app
  • <Application_Home>/Library/Caches
  • <Application_Home>/tmp

存放数据应该遵循以下规则:

  • 关键数据应该放在 <Application_Home>/Documents 目录中。关键数据是指不能被App重建的内容,包括用户文档及其它由用户产生的内容。

  • 支持文件(Support file)包含你的程序可以下载或者在需要时再次创建的内容。它的存储位置依赖于当前的iOS版本

    • 在iOS 5.1及之后的版本上,使用 setResourceValue:forKey:error:方法添加NSURLIsExcludedFromBackupKey属性到对应的NSURL上(如果使用的 Core Foundation,则使用CFURLSetResourcePropertyForKey 方法添加kCFURLIsExcludedFromBackupKey键),通过这两种方法来阻止文件被备份到iCloud或iTunes上。
    • 在iOS 5.0及更早的版本上,支持文件放在 <Application_Home>/Library/Caches 目录里才能防止被备份。在iOS 5.0.1上,请参见How do I prevent files from being backed up to iCloud and iTunes?
  • 缓存数据(包括并不限于数据库缓存文件和下载内容,比如杂志,报刊及地图程序)应该放在<Application_Home>/Library/Caches目录中,并且你的程序需要幽雅的处理缓存数据被删除的情况。

  • 临时数据应该放在<Application_Home>/tmp目录中,当你不需要的时候请记得删除它。

应用程序更新时的文件保存

在应用程序更新时,下列目录保证会被保留:
<Application_Home>/Documents
<Application_Home>/Library

虽然其它目录也可能会被,但在更新后不应该依赖它们。

有效地使用内存

响应低内存警告

UIKit提供了几种接收低内存警告的方法,包含如下:

  • 实现app delegate中的applicationDidReceiveMemoryWarning: 方法
  • 在UIViewController的子类中重写 didReceiveMemoryWarning 方法
  • 注册接收UIApplicationDidReceiveMemoryWarningNotificationnotification通知

降低您的应用程序的内存占用

  • 消除内存泄漏
  • 使资源文件尽可能的小
  • 为大型数据集使用Core Data或SQLite
  • 惰性加载资源
  • 编译程序时使用的Thumb选项。

明智地分配内存

  • 减少自动释放(autorelease)对象的使用
  • 限制资源的大小
  • 避免无界集问题

将工作移出主线程

使用GCD或operation异步执行任务

浮点运算注意事项

使用基于硬件的浮点运算。

降低功耗

  • 避免使用轮训,它会阻止CPU睡眠。使用 NSRunLoop 或NSTimer 来安排任务。
  • 尽可能的设置 UIApplication 对象的idleTimerDisabled 属性为NO。
  • 最大化空闲时间。进行一组计算工作比在一段时间内执行若干小片工作省时。
  • 避免频繁访问磁盘。
  • 绘制屏幕不要比需要的快。
  • 如果您使用的UIAccelerometer类接受定期的加速度事件,记得在不用的时候关掉它。

越多的数据需要传输,就会耗费越多的电力,请遵循如下建议:

  • 仅在需要时连接网络
  • 使用紧凑的数据格式,最小化需要传输的数据。
  • 集中传输数据,而不要一直不停的传输。
  • 尽可能使用Wi-Fi,它比蜂窝网络更省电。
  • 如果使用Core Location获得位置信息,给具体过滤器和精度设置适当的值,不使用时尽快关闭它。

调整你的代码

使用Instruments工具在模拟器和真机上跟踪你的代码并做必要的优化。

改善文件访问时间

最小化需要写到磁盘的数据。

  • 仅在文件变化后写入磁盘。
  • 定义文件格式时,将频繁修改的内容组织起来最小化每次需要写的块。
  • 如果您的数据是随机访问的结构化内容,将其存储在持久性存储Core Data或SQLite数据库,特别是如果你正在操作的数据量可能会增长到几百兆以上。

避免缓存文件写入磁盘。此规则的唯一例外的是,当您的应用程序退出,你需要写的状态信息可以用来把你的应用程序在下次载入时返回到相同的状态。

调整你的网络代码

高效的网络技巧

  • 使用紧凑的数据格式
  • 避免使用繁琐的协议
  • 尽可能集中传输数据

使用 Wi-Fi

如果你在程序使用Wi-Fi,最好在Info.plist文件中用UIRequiresPersistentWiFi键声明。如果检测到任何活动的Wi-Fi热点,含有此键可以让系统知道它应该显示“选择网络”对话框中,

飞行模式警告

如果程序在飞行模式下打开,系统会弹出警告提醒用户,需满足以下条件:
* UIRequiresPersistentWiFi 设置为true
* 在飞行模式下程序被载入
* 在切换到飞行模式后,Wi-Fi 功能没有被手动激活

-EOF-

IE iframe文档模式继承关系

上周人肉探测了一份不同浏览器(IE 8/9/10)下iframe页面与父页面文档模式关系表。

大致结论是:

1.在父窗口文档模式小于9的情况下:iframe中的页面可以指定自己的文档模式,但是最高不超过8。

2.在文档模式为9/10的情况下:iframe中的页面自己指定文档模式无效,直接继承自父页面文档模式。

3.不指定iframe中页面的文档模式的情况下:若父页面文档模式小于9,则iframe中页面的文档模式为8;若父页面文档模式大于8,iframe中页面的文档模式继承自父页面文档模式(第2条)。

4.若父页面文档模式指定为7,iframe中页面不指定文档模式,iframe中页面的文档模式为8。

具体测试页面:http://ioio.jit.su/base

综上,这里的建议是,若页面仅在iframe中存在,不需要明确指定页面的文档模式。

下载:[download id=”53″]

-EOF-

IE8出现“网页有错误,找不到元素”错误解决方法

如果IE8出现“网页有错误,找不到元素”的错误,有可能是注册表中的值被修改了导致的,通常情况下将如下内容保存成一个.reg注册表文件,导入注册表即可:

Windows Registry Editor Version 5.00
 
[HKEY_CLASSES_ROOT\TypeLib\{EAB22AC0-30C1-11CF-A7EB-0000C05BAE0B}\1.1\0\win32]
@="C:\\WINDOWS\\system32\\ieframe.dll"

若是开发者的话,还是不要直接忽略这个错误,走查脚本还是能够定位到具体问题的,比如有可能是window.external对象不能访问。

参考资料: IE8新建选项卡“网页有错误,找不到元素”
-EOF-