原文: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-