[中文]iOS技术问答 QA1747 调试部署的iOS应用程序

QA1747调试部署的iOS应用程序

问:我如何在没有Xcode调试器的情况下调试一个已部署的程序?

答:一旦你已经部署你的应用,无论是通过App Store还是企业部署,你都无法使用Xcode的调试器调试它。你需要通过分析设备的崩溃日志和控制台的输出来调试问题。

更多丰富NSLog语句的信息,请查看 Improved logging in Objective-C.。

获得奔溃日志和控制台输出
使用Xcode获得奔溃日志和控制台输出

重要提示:当前,Xcode并不会自动添加低内存警告的日志。你必须通过*不使用Xcode获得奔溃日志*一节的说明来手工获得他们。更多关于低内存日志的信息,请查看Understanding and Analyzing iOS Application Crash Reports.

即使你不能在Xcode调试器下运行这个程序,Xcode仍然可以给你所有你需要的信息来调试问题。

  1. 插上设备并打开Xcode
  2. 打开Organizer窗口并选择Device选项卡
  3. 在DEVICES部分,展开该设备列表
  4. 选择Device Logs查看奔溃日志或者选择Console查看控制台输出

不使用Xcode获得控制台输出
有时你需要现场调试一个问题,或者告诉测试人员如何获得更多的信息提供给你。在没有安装Xcode的情况下,可以下载*iPhone 配置实用工具*来保存控制台输出。它可用于Mac OS X和Windows。

  1. 插上设备并打开iPhone 配置实用工具
  2. 选择左侧DEVICES菜单下的设备
  3. 选择Console选项卡
  4. 按下窗口右下角的*Save Console As…*按钮导出控制台日志

不使用Xcode获得奔溃日志
在插入设备并同步iTunes后,根据不同的平台,奔溃日志可以在以下位置找到。

Mac OS X:
~/Library/Logs/CrashReporter/MobileDevice/<DEVICE_NAME>
 
Windows XP
C:\Documents and Settings\<USERNAME>\Application Data\Apple Computer\Logs\CrashReporter\MobileDevice\<DEVICE_NAME>
 
Windows Vista or 7
C:\Users\<USERNAME>\AppData\Roaming\Apple Computer\Logs\CrashReporter\MobileDevice\<DEVICE_NAME>

是使用者登陆计算机的名称。 是iOS设备的名称, 比如, “John’s iPhone”.

启用App Store诊断报告

重要提示:当前,Xcode并不会自动添加低内存警告的日志。你必须通过*不使用Xcode获得奔溃日志*一节的说明来手工获得他们。更多关于低内存日志的信息,请查看Understanding and Analyzing iOS Application Crash Reports.

如果一个程序被部署在App Stroe,你可以在iTunes Connect中查看到奔溃报告。但仅限于选择发送诊断和用量信息给Apple的用户。

如果有人报告了一个奔溃,而你没有在iTunes Connect中看到相应的报告,你可能需要依据以下的基础知识文章适用于Mac或适用于Windows指导他们,以便他们可以选择发送给你奔溃报告。

那些关闭App Store诊断报告的用户人和可以获得奔溃日志,以*不使用Xcode获得奔溃日志*一节所描述的方式获得,然后手工发送他们。

理解奔溃日志和控制台输出
理解奔溃日志的第一步和最重要一步是符号化他们。符号地址是使用人类可读的函数名称和行号替换内存地址。

如果你通过Xcode的Organizer窗口得到了一个设备的奔溃日志,然后他们会自动在几秒钟以后自动为您符号化。否则你将需要自己通过将.crash文件导入到Xcode Organizer中符号化。打开Xcode Organizer,选择“设备”选项卡,选择“LIBRARY”菜单下的“Device Logs”,点击“Import”按钮并选择.crash文件。

更多关于奔溃日志的信息,请查看 Understanding and Analyzing iOS Application Crash Reports 技术说明,以及 Understanding Crash Reports on iPhone OS WWDC 2010 Session.

via Technical Q&A QA1747 Debugging Deployed iOS Apps

-EOF-

[翻译]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-