码迷,mamicode.com
首页 > 移动开发 > 详细

iOS 异常处理(二)

时间:2015-11-21 22:31:41      阅读:181      评论:0      收藏:0      [点我收藏+]

标签:

 上一篇文章,主要将开发中中,怎么预防崩溃的做法,但是在开发中,还有很多异常崩溃,当遇到这些异常的时候,我们如何解决呢

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.会在工程编译时自动静态编译,提示你更多的从错误信息。

 

iOS 异常处理(二)

标签:

原文地址:http://www.cnblogs.com/16zj/p/4984740.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!