防止数组越界处理
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 ----------\n", 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 ----------\n", class_getName(self.class), __func__);
NSLog(@"可变数组异常%@", [exception callStackSymbols]);
return nil;
}
@finally {}
} else {
return [self objectAtIndexCheck:index];
}
}
@end

浙公网安备 33010602011771号