1、不可变数组
#import "NSArray+ArrayCheck.h" #import <objc/runtime.h> @implementation NSArray (ArrayCheck) + (void)load{ static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ Method fromMethod = class_getInstanceMethod(objc_getClass("__NSArrayI"), @selector(objectAtIndex:)); Method toMethod = class_getInstanceMethod(objc_getClass("__NSArrayI"), @selector(objectAtIndexCheck:)); method_exchangeImplementations(fromMethod, toMethod); }); } - (id)objectAtIndexCheck:(NSUInteger)index { if (self.count-1 < index) { // 异常处理 @try { return [self objectAtIndexCheck:index]; } @catch (NSException *exception) { // 打印崩溃信 NSLog(@"---------- %s Crash Because Method %s ---------- ", class_getName(self.class), __func__); NSLog(@"不可变数组异常%@", [exception callStackSymbols]); return nil; } @finally {} } else { return [self objectAtIndexCheck:index]; } } @end
2、可变数组
#import "NSMutableArray+ArrayMCheck.h" #import <objc/runtime.h> @implementation NSMutableArray (ArrayMCheck) + (void)load{ static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ Method fromMethod = class_getInstanceMethod(objc_getClass("__NSArrayM"), @selector(objectAtIndex:)); Method toMethod = class_getInstanceMethod(objc_getClass("__NSArrayM"), @selector(objectAtIndexCheck:)); method_exchangeImplementations(fromMethod, toMethod); }); } - (id)objectAtIndexCheck:(NSUInteger)index { if (self.count-1 < index) { // 异常处理 @try { return [self objectAtIndexCheck:index]; } @catch (NSException *exception) { // 打印崩溃信息 NSLog(@"---------- %s Crash Because Method %s ---------- ", class_getName(self.class), __func__); NSLog(@"可变数组异常%@", [exception callStackSymbols]); return nil; } @finally {} } else { return [self objectAtIndexCheck:index]; } } @end