这篇文章还可以在这里找到 英语

场景 4: 吃棒棒糖时闪退!

用户邮件说, “当rage master吃棒棒糖时应用就闪退…” 另一用户说, “我让rage master 吃棒棒糖,没几次应用就闪退了!”
崩溃日志如下:

  1. Incident Identifier: 081E58F5-95A8-404D-947B-5E104B6BC1B1
  2. CrashReporter Key: 5a56599d836c4f867f6eec76afee451bf9ae5f31
  3. Hardware Model: iPhone4,1
  4. OS Version: iPhone OS 6.0 (10A403)
  5. Kernel Version: Darwin Kernel Version 13.0.0: Sun Aug 19 00:28:05 PDT 2012; root:xnu-2107.2.33~4/RELEASE_ARM_S5L8940X
  6. Date: 2012-11-03 13:39:59 -0400
  7. Time since snapshot: 4353 ms
  8. Free pages: 968
  9. Active pages: 7778
  10. Inactive pages: 4005
  11. Throttled pages: 92319
  12. Purgeable pages: 0
  13. Wired pages: 23347
  14. Largest process: Rage Masters
  1. Processes
  2. Name <UUID> rpages recent_max [reason] (state)
  3.  
  4. lsd <6a9f5b5f36b23fc78f87b6d8f1f49a9d> 331 331 [vm] (daemon) (idle)
  5. afcd <b0aff2e7952e34a9882fec81a8dcdbb2> 141 141 [vm] (daemon) (idle)
  6. itunesstored <4e0cd9f873de3435b4119c48b2d6d13d> 1761 1761 [vm] (daemon) (idle)
  7. softwareupdatese <2bc4b5ae016431c98d3b34f81027d0ae> 311 311 [vm] (daemon) (idle)
  8. Amazon <4600481f07ec3e59a925319b7f67ba14> 2951 2951 [vm] (suspended)
  9. accountsd <ac0fce15c1a2350d951efc498d521ac7> 519 519 [vm] (daemon) (idle)
  10. coresymbolicatio <edba67001f76313b992056c712153b4b> 126 126 [vm] (daemon) (idle)
  11. Skype <504cf2fe60cb3cdea8273e74df09836b> 3187 3187 [vm] (background)
  12. MobileMail <bff817c61ce33c85a43ea9a6c98c29f5> 14927 14927 [vm] (continuous)
  13. MobileSMS <46778de076363d67aeea207464cfc581> 2134 2134 [vm] (background)
  14. MobilePhone <3fca241f2a193d0fb8264218d296ea41> 2689 2689 [vm] (continuous)
  15. librariand <c9a9be81aa9632f0a913ce79b911f27e> 317 317 [vm] (daemon)
  16. kbd <3e7136ddcefc3d77a01499db593466cd> 616 616 [vm] (daemon)
  17. tccd <eb5ddcf533663f8d987d67cae6a4c4ea> 224 224 [vm] (daemon)
  18. Rage Masters <90b45d6281e934209c5b06cf7dc4d492> 28591 28591 [vm] (frontmost) (resume)
  19. ptpd <04a56fce67053c57a7979aeea8e5a7ea> 879 879 (daemon)
  20. iaptransportd <f784f30dc09d32078d87b450e8113ef6> 230 230 (daemon)
  21. locationd <892cd1c9ffa43c99a82dba197be5f09e> 1641 1641 (daemon)
  22. syslogd <cbef142fa0a839f0885afb693fb169c3> 237 237 (daemon)
  23. mediaserverd <80657170daca32c9b8f3a6b1faac43a2> 4869 4869 (daemon)
  24. dataaccessd <2a3f6a518f3f3646bf35eddd36f25005> 1786 1786 (daemon)
  25. aosnotifyd <d4d14f2914c3343796e447cfef3e6542> 549 549 (daemon)
  26. wifid <9472b090746237998cdbb9b34f090d0c> 455 455 (daemon)
  27. SpringBoard <27372aae101f3bbc87804edc10314af3> 18749 18749
  28. backboardd <5037235f295b33eda98eb5c72c098858> 5801 5801 (daemon)
  29. UserEventAgent <6edfd8d8dba23187b05772dcdfc94f90> 601 601 (daemon)
  30. mediaremoted <4ff39c50c684302492e396ace813cb25> 293 293 (daemon)
  31. pasteboardd <8a4279b78e4a321f84a076a711dc1c51> 176 176 (daemon)
  32. springboardservi <ff6f64b3a21a39c9a1793321eefa5304> 0 0 (daemon)
  33. syslog_relay <45e9844605d737a08368b5215bb54426> 0 0 (daemon)
  34. DTMobileIS <23303ca402aa3705870b01a9047854ea> 0 0 (daemon)
  35. notification_pro <845b7beebc8538ca9ceef731031983b7> 169 169 (daemon)
  36. syslog_relay <45e9844605d737a08368b5215bb54426> 0 0 (daemon)
  37. ubd <74dc476d1785300e9fcda555fcb8d774> 976 976 (daemon)
  38. twitterd <4b4946378a9c397d8250965d17055b8e> 730 730 (daemon)
  39. configd <4245d73a9e96360399452cf6b8671844> 809 809 (daemon)
  40. absinthed.N94 <7f4164c844fa340caa940b863c901aa9> 99 99 (daemon)
  41. filecoordination <fbab576f37a63b56a1039153fc1aa7d8> 226 226 (daemon)
  42. distnoted <a89af76ec8633ac2bbe99bc2b7964bb0> 137 137 (daemon)
  43. apsd <94d8051dd5f5362f82d775bc279ae608> 373 373 (daemon)
  44. networkd <0032f46009f53a6c80973fe153d1a588> 219 219 (daemon)
  45. aggregated <8c3c991dc4153bc38aee1e841864d088> 112 112 (daemon)
  46. BTServer <c92fbd7488e63be99ec9dbd05824f5e5> 522 522 (daemon)
  47. fairplayd.N94 <7bd896bd00783a48906090d05cf1c86a> 210 210 (daemon)
  48. fseventsd <996cc4ca03793184aea8d781b55bce08> 384 384 (daemon)
  49. imagent <1e68080947be352590ce96b7a1d07b2f> 586 586 (daemon)
  50. mDNSResponder <3e557693f3073697a58da6d27a827d97> 295 295 (daemon)
  51. lockdownd <ba1358c7a8003f1b91af7d5f58dd5bbe> 389 389 (daemon)
  52. powerd <2d2ffed5e69638aeba1b92ef124ed861> 174 174 (daemon)
  53. CommCenter <1f425e1e897d32e8864fdd8eeaa803a8> 2212 2212 (daemon)
  54. notifyd <51c0e03da8a93ac8a595442fcaac531f> 211 211 (daemon)
  55. ReportCrash <8c32f231b2ed360bb151b2563bcaa363> 337 337 (daemon)

这日志跟我们前面见到的相差很多。

这个一个来自iOS 6的低内存崩溃日志。正如我们前面所说的,低内存崩溃日志与其他类型的崩溃日志很不一样,它们不指向特定的文件和代码行。相反,它们画出了闪退时设备上的内存使用情况的图表。

至少,头部还是跟其他崩溃日志很像的: 提供了 Incident Identifier, CrashReporter Key, Hardware Model, OS Version等信息。

接下来部分是低内存崩溃日志特有的:

  • Free pages 指可用内存页数。每页大小约是4KB, 上面的日志中,可用内存约为3,872 KB (或者说 3.9 MB)。
  • Purgeable pages 是那部分可被清除或重用的内存。在上面的日志中,是0KB。
  • Largest process是闪退时使用大部分内存的应用名称,在上面的日志中,正是你的应用!
  • Processes显示了闪退时各进程列表,还包含内存使用量。包含进程名 (第一列), 进程唯一标识符(第二名), 进程使用的内存页数(第三列)。最后一列是每个应用的状态。通常,发生闪退的应用的状态是 frontmost。 这里是 Rage Masters, 使用28591 页 (or 114.364 MB) 内存——这内存太多了!

通过,最大进程和frontmost状态的应用是相同的, 而且也是引起低内存闪退的应用进程。但是也可能看到最大进程和 frontmost状态应用不同的例子。比如,如果最大进程是SpringBoard, 忽略它 , 因为 SpringBoard 进程是显示主屏幕的应用,出现在你双击home按钮等情况,而且它是一直活动的。
低内存发生时,iOS向活动的应用发出低内存警告并终止后台应用。如果前台应用仍然继续增长内存,iOS将终止它。
为了查找低内存问题的原因,你必需使用Instruments剖析应用。如果你不知道怎么做,可以看一下我们 一篇关于这个方面的教程.。 :] 另外, 你也可以走捷径,响应低内存警告通知,以解决部分闪退问题。
回到Xcode查看RMLollipopLicker.m文件。 这是实现吃棒棒糖的视图控制器。看看源代码:

  1. #import "RMLollipopLicker.h"
  2.  
  3. #define COUNT 20
  4.  
  5. @interface RMLollipopLicker ()
  6. @property (weak, nonatomic) IBOutlet UIProgressView *progressView;
  7. @property (weak, nonatomic) IBOutlet UILabel *label;
  8. @property (weak, nonatomic) IBOutlet UILabel *lickedTimeLabel;
  9. @end
  10.  
  11. @implementation RMLollipopLicker {
  12. NSOperationQueue *queue;
  13. NSMutableArray *lollipops;
  14. }
  15.  
  16. #pragma mark - Life cycle
  17.  
  18. - (void)viewDidLoad {
  19. [super viewDidLoad];
  20.  
  21. self.progressView.progress = 0.0;
  22. self.label.text = [NSString stringWithFormat:@"Tap on run and I'll lick a lollipop %d times!", COUNT];
  23. self.lickedTimeLabel.text = @"";
  24.  
  25. lollipops = [[NSMutableArray alloc] init];
  26. queue = [[NSOperationQueue alloc] init];
  27. }
  28.  
  29. - (void)lickLollipop {
  30. NSURL *fileURL = [[NSBundle mainBundle] URLForResource:@"Lollipop" withExtension:@"plist"];
  31. NSDictionary *dictionary = [NSDictionary dictionaryWithContentsOfURL:fileURL];
  32. NSString *lollipop = [dictionary objectForKey:@"Lollipop"];
  33. [lollipops addObject:lollipop];
  34. }
  35.  
  36. #pragma mark - IBActions
  37.  
  38. - (IBAction)doneButtonPressed:(id)sender {
  39.  
  40. [self dismissViewControllerAnimated:YES completion:nil];
  41. }
  42.  
  43. - (IBAction)runButtonPressed:(id)sender {
  44.  
  45. [sender setEnabled:NO];
  46. [queue addOperationWithBlock:^{
  47.  
  48. for (NSInteger i = 0 ; i = COUNT) {
  49. self.label.text = [NSString stringWithFormat:@"Tap on run and I'll lick a lollipop %d times!", COUNT];
  50. self.progressView.progress = 0.0;
  51. [sender setEnabled:YES];
  52. }
  53. }];
  54. }
  55. }];
  56.  
  57. }
  58.  
  59. @end

当用户点击运行按钮, 应用开始一个背景线程,调用 lickLollipop 方法若干次,然后更新界面反映吃棒棒糖的数量。 lickLollipop 方法从属性列表文件(PLIST)文件读取一个长字符串,然后添加到数组上。这些数据并不重要, 能在不影响用户体验的前提下重新创建。
利用每种能够清除和重建数据而不影响用户体验的情况是好习惯。这样能够方便地释放内存,减少低内存警告。
那么,如何提高代码质量呢? 实现 didReceiveMemoryWarning 方法,像下面这样处理数据:

  1. -(void)didReceiveMemoryWarning {
  2. [lollipops removeAllObjects];
  3. [super didReceiveMemoryWarning];
  4. }

搞定!

下一步?

万岁,你研究了4个闪退案例! 你的应用更完善了,并且学到了一些重要的调试技巧。
你可以到这里下载改进后的项目代码。
你喜欢iOS崩溃日志揭秘吗? 希望你能将学到的运用到你自己的应用中,也希望你能处理闪退,使你的应用更强壮!
如果你对本教程或崩溃日志有问题或意见,可以在下面发表评论。

【转】iOS应用崩溃日志揭秘2的更多相关文章

  1. 转:ios应用崩溃日志揭秘

    http://www.raywenderlich.com/zh-hans/30818/ios应用崩溃日志揭秘

  2. iOS应用崩溃日志揭秘2

    这篇文章还可以在这里找到 英语 场景 4: 吃棒棒糖时闪退! 用户邮件说, “当rage master吃棒棒糖时应用就闪退…” 另一用户说, “我让rage master 吃棒棒糖,没几次应用就闪退了 ...

  3. 【转】iOS应用崩溃日志揭秘

    这篇文章还可以在这里找到 英语 If you're new here, you may want to subscribe to my RSS feed or follow me on Twitter ...

  4. iOS应用崩溃日志揭秘

    这篇文章还可以在这里找到 英语 Learn how to make sense of crash logs! 本文作者是 Soheil Moayedi Azarpour, 他是一名独立iOS开发者. ...

  5. iOS应用崩溃日志分析 iOS应用崩溃日志揭秘

    转自:http://www.raywenderlich.com/zh-hans/30818/ios%E5%BA%94%E7%94%A8%E5%B4%A9%E6%BA%83%E6%97%A5%E5%BF ...

  6. iOS开发-应用崩溃日志揭秘(一)

    作为一名应用开发者,你是否有过如下经历? 为确保你的应用正确无误,在将其提交到应用商店之前,你必定进行了大量的测试工作.它在你的设备上也运行得很好,但是,上了应用商店后,还是有用户抱怨会闪退 ! 如果 ...

  7. iOS开发--应用崩溃日志揭秘(二)

    场景 4: 吃棒棒糖时闪退! 用户邮件说, “当rage master吃棒棒糖时应用就闪退…” 另一用户说, “我让rage master 吃棒棒糖,没几次应用就闪退了!”崩溃日志如下: Incide ...

  8. iOS,应用崩溃日志分析

    参考资料:http://www.cocoachina.com/industry/20130725/6677.html 1.获得崩溃日志 2.崩溃日志实例 3.符号化崩溃日志 4.低内存闪退 获得崩溃日 ...

  9. 【转】iOS应用崩溃日志分析

    作为一名应用开发者,你是否有过如下经历?   为确保你的应用正确无误,在将其提交到应用商店之前,你必定进行了大量的测试工作.它在你的设备上也运行得很好,但是,上了应用商店后,还是有用户抱怨会闪退 ! ...

随机推荐

  1. Android入门教程之我见

    真正的从安卓入门学习到实际工作也差不多一年时间了,也做了几个项目.在这期间经历了一开始学习Android的基本知识后仍旧无从下手,不知道如何开始开发一个app,到现在也开始学会注意Android架构的 ...

  2. chrome浏览器默认样式覆盖input背景

    问题描述:input表单添加了背景图片,结果自动填充是,编程了一个淡黄色矩形方框. 解决方案:网上查询了很多的解决方式,基本都不管用,这里我简单说两个. 1.去除黄色背景 input:-webkit- ...

  3. bzoj 2746: [HEOI2012]旅行问题 AC自动机fail树

    2746: [HEOI2012]旅行问题 Time Limit: 30 Sec  Memory Limit: 256 MBSubmit: 489  Solved: 174[Submit][Status ...

  4. Java ,单实例 多线程 ,web容器,servlet与struts1-2.x系列,线程安全的解决

    1.Servlet是如何处理多个请求同时访问呢? 回答:servlet是默认采用单实例,多线程的方式进行.只要webapp被发布到web容器中的时候,servlet只会在发布的时候实例化一次,serv ...

  5. 在安全层面,企业如何获得更好的投资回报率 ROI?

    前言 任何企业对投资都有回报的要求,回报可能是直接的「利润」,达到短期.长期的目标,或者通过投资减少损失.因此每个项目的决策者在每笔投资前都要衡量 ROI,证明该投资能达到的效果和收益,以便在项目结束 ...

  6. iOS开发UI篇—UITableviewcell的性能问题

    iOS开发UI篇—UITableviewcell的性能问题 一.UITableviewcell的一些介绍 UITableView的每一行都是一个UITableViewCell,通过dataSource ...

  7. WebService开发应用

    WebService是运行于服务端(一般放在信息服务器上的)让客户端来调用的. 以下开发两个简单的实例 1.自己开发服务端自己调用(vs2010) 1).菜单:“新建-项目”,在打开的窗体中选择,如下 ...

  8. java常量使用比较好的方法

    1.首先建立一个工具类 public class AppConst { private static Map<String,String> map=new HashMap<Strin ...

  9. java 正则表达式去除标点符号

      public class Test { public static void main(String[] args) { String str = "!!!??!!!!%*)%¥!KTV ...

  10. Android学习笔记(十二)BroadcastReceiver的有序广播和优先级

    前两篇博文中简单整理了普通广播,其实还有有序广播,有序广播在开发中也是比不可少的,可以给广播接收者设定优先级来控制接受顺序,并却可以中断广播传递等等. 一.两种Broadcast: · 普通广播(No ...