这是一个简单避免app crash的框架;随着app不断的迭代,代码会变得越来越多,经过N个人的持续N年的代码,维护起来越来越难,也很难保证测试case覆盖所有场景。举一个例子如果原来服务器返回的是数组,而现在返回字符串,如果代码上没有添加判断,很可能就会造成“unrecognized selector sent to instance”,谁也不知道当初这么写的逻辑,没人敢动老代码。几万甚至数十万行的代码,这样的风险不可避免。
此项目希望尽量对源代码少的改动,增加程序的健壮性,避免由于异常情况导致的crash。主要实现原理就是通过方法替换和消息转发的机制,避免因为程序缺少判断而导致crash
1.使用 Cocoapods 来集成LongCrash, 集成方法如下:
pod 'LongCrash'
LongCrash使用方法
#import "LongCrashManager.h"
@interface AppDelegate () <LongCrashDelegate>
@end
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch.
//注册回调
[[LongCrashManager sharedInstancel] addDelegate:self delegateQueue:nil];
}
#pragma mark - LongCrashDelegate
//回调给开发者的信息,打印了可能引起crash的信息
- (void)didCrashWithInfo:(NSString *)aInfo
{
NSLog(@"%@",aInfo);
}
数据回调格式,方便开发者分析错误,并及时修复
回调数据:
LongCrash|[AppDelegate showmethemoney]|unrecognized selector sent to class|0x60000002f660|instance|callStackSymbols
格式对照:
框架名|[实例名称or类名称 调用方法]|错误类型|地址|实例or类调用|调用栈信息
下面是几种目前支持捕捉crash的错误,此项目也会针对常见crash做出实时更新
//unrecognized selector
[[NSString class] performSelector:@selector(hello:world:) withObject:@""];
[[NSString new] performSelector:@selector(hello:world:) withObject:@""];
//数组越界
NSArray *array = @[@"1",@"2"];
id value = [array objectAtIndex:2];
//字典设置nil
id value = nil;
NSMutableDictionary *dic = [NSMutableDictionary dictionary];
[dic setObject:@"123" forKey:value];
[dic setObject:value forKey:@"key"];
进入LongCrashDemo路径下执行,点击LongCrashDemo.xcworkspace即可运行
pod install
- 回调信息增加调用栈信息(默认不打印,需要设置),规范回调数据格式
- 避免NSArray因initWithObjects:count:包含nil引起crash
- 避免NSArray因addObject: or insertObject:atIndex:异常数据引起crash
- 避免NSMutableDictionary因removeObjectForKey:设置nil引起crash
- 避免app因unrecognized selector引起crash
- 避免NSArray因为beyond bounds引起crash
- 避免NSMutableDictionary因setObject:forKey:设置nil引起crash