上一篇文章,主要将开发中中,怎么预防崩溃的做法,但是在开发中,还有很多异常崩溃,当遇到这些异常的时候,我们如何解决呢
1 NSSetUncaughtExceptionHandler
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // Override point for customization after application launch. NSSetUncaughtExceptionHandler(&UncaughtExceptionHandler); return YES; } void UncaughtExceptionHandler(NSException *exception) { /** * 获取异常崩溃信息 */ NSArray *callStack = [exception callStackSymbols]; NSString *reason = [exception reason]; NSString *name = [exception name]; NSString *content = [NSString stringWithFormat:@"========异常错误报告========\nname:%@\nreason:\n%@\ncallStackSymbols:\n%@",name,reason,[callStack componentsJoinedByString:@"\n"]]; }
2.环境变量
菜单里Product->EditScheme->Run->Environment Variables, 添加NSZombieEnabled,并设置其值为YES。Zombie环境变量对于处理EXC_BAD_ACCESS类型崩溃很有效。
当这个zombie工具被启用之后,即使这个对象被释放了,这个对象的内存也不会被清理。所以,那块内存将会被标记为“长生不死的”。假如你试着之后又去使用这块内存,这个app能够意识到你的错误操作,并且app将会抛出“message sent to daellocated instance”错误并且终止运行。
你不应该一直启用zombie objects。因为这个工具将永远不会释放内存,只是简单标记一下这个内存是不死的,你最终将会在某个时候耗尽所有的内存。因此你应该在排查内存相关的错误的时候才开启zombie objects,其他时候应该关闭它。
3.崩溃断点
<1>在工程左侧的控制栏找到断点控制栏(Breakpoint Navigator),选择它
<2>点击左下角"+",选择"Add Exception BreakPoint..."
<3>弹出框之后选择"Done"之后,断点控制栏就会多出一个断点:All Exceptions.
设置完成之后,改断点可以再大部分崩溃发生之前,停留在崩溃代码行。方便查看崩溃信息。当程序崩溃时,如果断点启用,那么查看堆栈信息,被高亮的代码信息就是程序代码,而灰色的部分则是系统方法调用。
比如:
NSMutableDictionary* dict = [NSMutableDictionary dictionary]; [dict setObject:nil forKey:@"key"];
这里如果直接运行,会崩溃,如果添加了"Add Exception BreakPoint..
就会直接定位到 崩溃位置:
总结:
1.注意编译警告,每一个编译警告都是一个潜在BUG,它总会在某种情况下发生错误。
2.编译时自动静态编译设置:Build Settings ->Run Static Analyzer 设置为YES.会在工程编译时自动静态编译,提示你更多的从错误信息。