Method Swizzling 处理一类简单的崩溃

    在C/S开发时,程序员经常会由于粗心,或者服务端不经客户端添加一些数据,如果代码写的不够严谨,经常会出现数组访问越界一类的崩溃,如何出现问题了,可以不崩溃,只是进行上报,后台收集到信息后利用JSPatch或者其他工具进行修复.

    这里核心的就是一个方法

OBJC_EXPORT void method_exchangeImplementations(Method m1, Method m2) 
     __OSX_AVAILABLE_STARTING(__MAC_10_5, __IPHONE_2_0);

这里有2个参数,2个要在运行时交换的方法.

Foundation框架里objectAtIndex是不带有越界检测功能的,so,我们可以自己重写objectAtIndex并实现越界检测的功能.

- (instancetype)safe_objectAtIndex:(NSUInteger)index {
    if (self.count - 1 < index) {
        @try {
            return [self safe_objectAtIndex:index];
        }
        @catch (NSException *exception) {
            NSLog(@"---------- %s Crash Because Method %s  ----------\n", class_getName(self.class), __func__);
            NSLog(@"%@", [exception callStackSymbols]);
            return nil;
        }
        @finally {
        }
    } else {
        return [self safe_objectAtIndex:index];
    }
    
}

这里实现一个safe_objectAtIndex,并对越界进行判断.当catch到崩溃后,进行上报或者其它通知后台的操作,这样给用户的体验更好些,而且也可以收集到我们想要的崩溃信息了.

具体的实现见GitHub代码

你可能感兴趣的:(method,Swizzling,苹果黑魔法)