崩溃

异常处理

  • 抛出异常。此时程序会强制停止
    • @throw [NSException exceptionWithName:@"牛逼的错误" reason:@"方法找不到" userInfo:nil];
    • [NSException raise:@"牛逼的错误" format:@"%s",__func__];
  • 拦截异常
@try {
        @[][0];
    } @catch (NSException *exception) {
        NSLog(@"代码有异常-%@",exception);
    } @finally {
        NSLog(@"finally");
    }
  • 如果try里面的代码有错误,会执行catch,然后执行finally;如果try没有错误,执行完try,直接执行finally

崩溃统计分析

  • 方法一。在main函数中拦截崩溃。不过一般不这么干。
int main(int argc, char * argv[]) {
    @try {
        @autoreleasepool {
            return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
        }
    } @catch (NSException *exception) {
    //存放崩溃信息到本地
        NSString *file = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)objectAtIndex:0];
        NSString *fileName = [file stringByAppendingPathComponent:@"exception"];
        [[exception callStackSymbols] writeToFile:fileName atomically:YES];
    } @finally {

    }
}
  • 方法二。在appDelegate中拦截异常。在崩溃之前拦截。
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    //这句是关键代码
    NSSetUncaughtExceptionHandler(handleException);
    return YES;
}
//函数名随意
void handleException(NSException *exception){
//崩溃信息文件存放位置
    NSString *file = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)objectAtIndex:0];
    NSLog(@"file--%@",file);
    NSString *fileName = [file stringByAppendingPathComponent:@"exception"];
  //崩溃信息字典
    NSMutableDictionary *info = [NSMutableDictionary dictionary];
    info[@"callStack"] = [exception callStackSymbols];//调用栈信息(错误来源于哪个方法)
    info[@"name"] = [exception name];//异常名字
    info[@"reason"] = [exception reason]; //异常描述(报错理由)
    [info writeToFile:fileName atomically:YES];
}
  • 方法三。第三方
    • 友盟
    • Flurry
    • Crashlytics

弹出提醒的方法

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    NSSetUncaughtExceptionHandler(handleException);
    return YES;
}

void handleException(NSException *exception){
    [[UIApplication sharedApplication].delegate performSelector:@selector(handle)];
}

-(void)handle{
    UIAlertView *view = [[UIAlertView alloc]initWithTitle:@"哈哈" message:@"我是闪退前的挣扎" delegate:self cancelButtonTitle:@"好的" otherButtonTitles: nil];
    [view show]; 
    //重新启动runloop。这句是关键代码
    [[NSRunLoop currentRunLoop]addPort:[NSPort port] forMode:NSDefaultRunLoopMode];
    [[NSRunLoop currentRunLoop]run];
}

-(void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex{
    NSLog(@"点击了好的");
    exit(0);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值