这篇文章还可以在这里找到 英语
场景 4: 吃棒棒糖时闪退!
用户邮件说, “当rage master吃棒棒糖时应用就闪退…” 另一用户说, “我让rage master 吃棒棒糖,没几次应用就闪退了!”
崩溃日志如下:
- Incident Identifier: 081E58F5-95A8-404D-947B-5E104B6BC1B1
- CrashReporter Key: 5a56599d836c4f867f6eec76afee451bf9ae5f31
- Hardware Model: iPhone4,1
- OS Version: iPhone OS 6.0 (10A403)
- 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
- Date: 2012-11-03 13:39:59 -0400
- Time since snapshot: 4353 ms
- Free pages: 968
- Active pages: 7778
- Inactive pages: 4005
- Throttled pages: 92319
- Purgeable pages: 0
- Wired pages: 23347
- Largest process: Rage Masters
|
- Processes
- Name <UUID> rpages recent_max [reason] (state)
-
- lsd <6a9f5b5f36b23fc78f87b6d8f1f49a9d> 331 331 [vm] (daemon) (idle)
- afcd <b0aff2e7952e34a9882fec81a8dcdbb2> 141 141 [vm] (daemon) (idle)
- itunesstored <4e0cd9f873de3435b4119c48b2d6d13d> 1761 1761 [vm] (daemon) (idle)
- softwareupdatese <2bc4b5ae016431c98d3b34f81027d0ae> 311 311 [vm] (daemon) (idle)
- Amazon <4600481f07ec3e59a925319b7f67ba14> 2951 2951 [vm] (suspended)
- accountsd <ac0fce15c1a2350d951efc498d521ac7> 519 519 [vm] (daemon) (idle)
- coresymbolicatio <edba67001f76313b992056c712153b4b> 126 126 [vm] (daemon) (idle)
- Skype <504cf2fe60cb3cdea8273e74df09836b> 3187 3187 [vm] (background)
- MobileMail <bff817c61ce33c85a43ea9a6c98c29f5> 14927 14927 [vm] (continuous)
- MobileSMS <46778de076363d67aeea207464cfc581> 2134 2134 [vm] (background)
- MobilePhone <3fca241f2a193d0fb8264218d296ea41> 2689 2689 [vm] (continuous)
- librariand <c9a9be81aa9632f0a913ce79b911f27e> 317 317 [vm] (daemon)
- kbd <3e7136ddcefc3d77a01499db593466cd> 616 616 [vm] (daemon)
- tccd <eb5ddcf533663f8d987d67cae6a4c4ea> 224 224 [vm] (daemon)
- Rage Masters <90b45d6281e934209c5b06cf7dc4d492> 28591 28591 [vm] (frontmost) (resume)
- ptpd <04a56fce67053c57a7979aeea8e5a7ea> 879 879 (daemon)
- iaptransportd <f784f30dc09d32078d87b450e8113ef6> 230 230 (daemon)
- locationd <892cd1c9ffa43c99a82dba197be5f09e> 1641 1641 (daemon)
- syslogd <cbef142fa0a839f0885afb693fb169c3> 237 237 (daemon)
- mediaserverd <80657170daca32c9b8f3a6b1faac43a2> 4869 4869 (daemon)
- dataaccessd <2a3f6a518f3f3646bf35eddd36f25005> 1786 1786 (daemon)
- aosnotifyd <d4d14f2914c3343796e447cfef3e6542> 549 549 (daemon)
- wifid <9472b090746237998cdbb9b34f090d0c> 455 455 (daemon)
- SpringBoard <27372aae101f3bbc87804edc10314af3> 18749 18749
- backboardd <5037235f295b33eda98eb5c72c098858> 5801 5801 (daemon)
- UserEventAgent <6edfd8d8dba23187b05772dcdfc94f90> 601 601 (daemon)
- mediaremoted <4ff39c50c684302492e396ace813cb25> 293 293 (daemon)
- pasteboardd <8a4279b78e4a321f84a076a711dc1c51> 176 176 (daemon)
- springboardservi <ff6f64b3a21a39c9a1793321eefa5304> 0 0 (daemon)
- syslog_relay <45e9844605d737a08368b5215bb54426> 0 0 (daemon)
- DTMobileIS <23303ca402aa3705870b01a9047854ea> 0 0 (daemon)
- notification_pro <845b7beebc8538ca9ceef731031983b7> 169 169 (daemon)
- syslog_relay <45e9844605d737a08368b5215bb54426> 0 0 (daemon)
- ubd <74dc476d1785300e9fcda555fcb8d774> 976 976 (daemon)
- twitterd <4b4946378a9c397d8250965d17055b8e> 730 730 (daemon)
- configd <4245d73a9e96360399452cf6b8671844> 809 809 (daemon)
- absinthed.N94 <7f4164c844fa340caa940b863c901aa9> 99 99 (daemon)
- filecoordination <fbab576f37a63b56a1039153fc1aa7d8> 226 226 (daemon)
- distnoted <a89af76ec8633ac2bbe99bc2b7964bb0> 137 137 (daemon)
- apsd <94d8051dd5f5362f82d775bc279ae608> 373 373 (daemon)
- networkd <0032f46009f53a6c80973fe153d1a588> 219 219 (daemon)
- aggregated <8c3c991dc4153bc38aee1e841864d088> 112 112 (daemon)
- BTServer <c92fbd7488e63be99ec9dbd05824f5e5> 522 522 (daemon)
- fairplayd.N94 <7bd896bd00783a48906090d05cf1c86a> 210 210 (daemon)
- fseventsd <996cc4ca03793184aea8d781b55bce08> 384 384 (daemon)
- imagent <1e68080947be352590ce96b7a1d07b2f> 586 586 (daemon)
- mDNSResponder <3e557693f3073697a58da6d27a827d97> 295 295 (daemon)
- lockdownd <ba1358c7a8003f1b91af7d5f58dd5bbe> 389 389 (daemon)
- powerd <2d2ffed5e69638aeba1b92ef124ed861> 174 174 (daemon)
- CommCenter <1f425e1e897d32e8864fdd8eeaa803a8> 2212 2212 (daemon)
- notifyd <51c0e03da8a93ac8a595442fcaac531f> 211 211 (daemon)
- 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文件。 这是实现吃棒棒糖的视图控制器。看看源代码:
- #import "RMLollipopLicker.h"
-
- #define COUNT 20
-
- @interface RMLollipopLicker ()
- @property (weak, nonatomic) IBOutlet UIProgressView *progressView;
- @property (weak, nonatomic) IBOutlet UILabel *label;
- @property (weak, nonatomic) IBOutlet UILabel *lickedTimeLabel;
- @end
-
- @implementation RMLollipopLicker {
- NSOperationQueue *queue;
- NSMutableArray *lollipops;
- }
-
- #pragma mark - Life cycle
-
- - (void)viewDidLoad {
- [super viewDidLoad];
-
- self.progressView.progress = 0.0;
- self.label.text = [NSString stringWithFormat:@"Tap on run and I'll lick a lollipop %d times!", COUNT];
- self.lickedTimeLabel.text = @"";
-
- lollipops = [[NSMutableArray alloc] init];
- queue = [[NSOperationQueue alloc] init];
- }
-
- - (void)lickLollipop {
- NSURL *fileURL = [[NSBundle mainBundle] URLForResource:@"Lollipop" withExtension:@"plist"];
- NSDictionary *dictionary = [NSDictionary dictionaryWithContentsOfURL:fileURL];
- NSString *lollipop = [dictionary objectForKey:@"Lollipop"];
- [lollipops addObject:lollipop];
- }
-
- #pragma mark - IBActions
-
- - (IBAction)doneButtonPressed:(id)sender {
-
- [self dismissViewControllerAnimated:YES completion:nil];
- }
-
- - (IBAction)runButtonPressed:(id)sender {
-
- [sender setEnabled:NO];
- [queue addOperationWithBlock:^{
-
- for (NSInteger i = 0 ; i = COUNT) {
- self.label.text = [NSString stringWithFormat:@"Tap on run and I'll lick a lollipop %d times!", COUNT];
- self.progressView.progress = 0.0;
- [sender setEnabled:YES];
- }
- }];
- }
- }];
-
- }
-
- @end
|
当用户点击运行按钮, 应用开始一个背景线程,调用 lickLollipop 方法若干次,然后更新界面反映吃棒棒糖的数量。 lickLollipop 方法从属性列表文件(PLIST)文件读取一个长字符串,然后添加到数组上。这些数据并不重要, 能在不影响用户体验的前提下重新创建。
利用每种能够清除和重建数据而不影响用户体验的情况是好习惯。这样能够方便地释放内存,减少低内存警告。
那么,如何提高代码质量呢? 实现 didReceiveMemoryWarning 方法,像下面这样处理数据:
- -(void)didReceiveMemoryWarning {
- [lollipops removeAllObjects];
- [super didReceiveMemoryWarning];
- }
|
搞定!
下一步?
万岁,你研究了4个闪退案例! 你的应用更完善了,并且学到了一些重要的调试技巧。
你可以到这里下载改进后的项目代码。
你喜欢iOS崩溃日志揭秘吗? 希望你能将学到的运用到你自己的应用中,也希望你能处理闪退,使你的应用更强壮!
如果你对本教程或崩溃日志有问题或意见,可以在下面发表评论。
- 转:ios应用崩溃日志揭秘
http://www.raywenderlich.com/zh-hans/30818/ios应用崩溃日志揭秘
- iOS应用崩溃日志揭秘2
这篇文章还可以在这里找到 英语 场景 4: 吃棒棒糖时闪退! 用户邮件说, “当rage master吃棒棒糖时应用就闪退…” 另一用户说, “我让rage master 吃棒棒糖,没几次应用就闪退了 ...
- 【转】iOS应用崩溃日志揭秘
这篇文章还可以在这里找到 英语 If you're new here, you may want to subscribe to my RSS feed or follow me on Twitter ...
- iOS应用崩溃日志揭秘
这篇文章还可以在这里找到 英语 Learn how to make sense of crash logs! 本文作者是 Soheil Moayedi Azarpour, 他是一名独立iOS开发者. ...
- 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 ...
- iOS开发-应用崩溃日志揭秘(一)
作为一名应用开发者,你是否有过如下经历? 为确保你的应用正确无误,在将其提交到应用商店之前,你必定进行了大量的测试工作.它在你的设备上也运行得很好,但是,上了应用商店后,还是有用户抱怨会闪退 ! 如果 ...
- iOS开发--应用崩溃日志揭秘(二)
场景 4: 吃棒棒糖时闪退! 用户邮件说, “当rage master吃棒棒糖时应用就闪退…” 另一用户说, “我让rage master 吃棒棒糖,没几次应用就闪退了!”崩溃日志如下: Incide ...
- iOS,应用崩溃日志分析
参考资料:http://www.cocoachina.com/industry/20130725/6677.html 1.获得崩溃日志 2.崩溃日志实例 3.符号化崩溃日志 4.低内存闪退 获得崩溃日 ...
- 【转】iOS应用崩溃日志分析
作为一名应用开发者,你是否有过如下经历? 为确保你的应用正确无误,在将其提交到应用商店之前,你必定进行了大量的测试工作.它在你的设备上也运行得很好,但是,上了应用商店后,还是有用户抱怨会闪退 ! ...
随机推荐
- Android入门教程之我见
真正的从安卓入门学习到实际工作也差不多一年时间了,也做了几个项目.在这期间经历了一开始学习Android的基本知识后仍旧无从下手,不知道如何开始开发一个app,到现在也开始学会注意Android架构的 ...
- chrome浏览器默认样式覆盖input背景
问题描述:input表单添加了背景图片,结果自动填充是,编程了一个淡黄色矩形方框. 解决方案:网上查询了很多的解决方式,基本都不管用,这里我简单说两个. 1.去除黄色背景 input:-webkit- ...
- bzoj 2746: [HEOI2012]旅行问题 AC自动机fail树
2746: [HEOI2012]旅行问题 Time Limit: 30 Sec Memory Limit: 256 MBSubmit: 489 Solved: 174[Submit][Status ...
- Java ,单实例 多线程 ,web容器,servlet与struts1-2.x系列,线程安全的解决
1.Servlet是如何处理多个请求同时访问呢? 回答:servlet是默认采用单实例,多线程的方式进行.只要webapp被发布到web容器中的时候,servlet只会在发布的时候实例化一次,serv ...
- 在安全层面,企业如何获得更好的投资回报率 ROI?
前言 任何企业对投资都有回报的要求,回报可能是直接的「利润」,达到短期.长期的目标,或者通过投资减少损失.因此每个项目的决策者在每笔投资前都要衡量 ROI,证明该投资能达到的效果和收益,以便在项目结束 ...
- iOS开发UI篇—UITableviewcell的性能问题
iOS开发UI篇—UITableviewcell的性能问题 一.UITableviewcell的一些介绍 UITableView的每一行都是一个UITableViewCell,通过dataSource ...
- WebService开发应用
WebService是运行于服务端(一般放在信息服务器上的)让客户端来调用的. 以下开发两个简单的实例 1.自己开发服务端自己调用(vs2010) 1).菜单:“新建-项目”,在打开的窗体中选择,如下 ...
- java常量使用比较好的方法
1.首先建立一个工具类 public class AppConst { private static Map<String,String> map=new HashMap<Strin ...
- java 正则表达式去除标点符号
public class Test { public static void main(String[] args) { String str = "!!!??!!!!%*)%¥!KTV ...
- Android学习笔记(十二)BroadcastReceiver的有序广播和优先级
前两篇博文中简单整理了普通广播,其实还有有序广播,有序广播在开发中也是比不可少的,可以给广播接收者设定优先级来控制接受顺序,并却可以中断广播传递等等. 一.两种Broadcast: · 普通广播(No ...