虽然我们都不想我们编写的应用发生crash,但是crash是在所难免的。iOS系统对于crash有两种处理方式,一种是由EXC_BAD_ACCESS引起的,多为内存问题;另一种是未被捕获的Objective-C异常(NSException),导致程序向自身发送了SIGABRT信号而崩溃。我们需要了解一下如何获取crash信息。
当我们想在crash之前做某些操作的时候比如发送错误日志到邮件或者本地保存日志的时候,我们就可以使用系统的一个方法去实现。系统有一个名为NSSetUncaughtExceptionHandler的方法,是用于注册在crash时调用什么方法的。一般来说是在- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions这个方法里去注册如
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{
NSSetUncaughtExceptionHandler(要执行的函数名);
return YES;
}
为了方便使用我们可以定义一个类来处理异常这个类继承NSObject,然后在这个内部注册异常处理函数及实现想要的操作。
上面的注册换成定义的类的注册方法即可例如下面的startLog
#import "MyCrashLog.h"
#import<sys/signal.h>
@implementation MyCrashLog
+ (void)startLog
{
dispatch_once_t one;
dispatch_once(&one, ^{
//注册异常
NSSetUncaughtExceptionHandler(&uncaughtExceptionHandler);
//可添加信号量异常注册
});
}
static void uncaughtExceptionHandler(NSException *exception)
{
/ NSLog(@"异常:%@---",exception);
截获到异常 , 发生crash时会自动调用此方法名称自己可定义 但是要和注册的名称一样
在此处处理异常,根据自己的需求
}
@end
上面的代码只是注册和处理了EXC_BAD_ACCESS异常
要处理SIGABRT信号也是如同上面一样注册信号异常只是函数名不一样
在上述代码注册的时候添加类似
//注册信号量
signal(SIGABRT, headleSing);
signal(SIGPROF, headleSing);
signal(SIGPROF, headleSing);
的代码就可以注册相应的信号量了,其中headleSing为自定义的处理异常的信号的函数名
信号量有很多种可以按需求去注册
到此对于异常的获取结束