1.
上面方法已经可以避免crash,为了避免冗余的代码,写一个NSArray的分类,利用runtime替换NSArray的对象方法objectAtIndex:,在这里进行判断,捕获异常: #import <Foundation/Foundation.h> @interface NSArray (Crash) @end /*** ---------------分割线--------------- ***/ #import "NSArray+Crash.h" #import <objc/runtime.h> @implementation NSArray (Crash) + (void)load { [super load]; //替换不可变数组方法 Method oldObjectAtIndex = class_getInstanceMethod(objc_getClass("__NSArrayI"), @selector(objectAtIndex:)); Method newObjectAtIndex = class_getInstanceMethod(objc_getClass("__NSArrayI"), @selector(objectAtSafeIndex:)); method_exchangeImplementations(oldObjectAtIndex, newObjectAtIndex); //替换可变数组方法 Method oldMutableObjectAtIndex = class_getInstanceMethod(objc_getClass("__NSArrayM"), @selector(objectAtIndex:)); Method newMutableObjectAtIndex = class_getInstanceMethod(objc_getClass("__NSArrayM"), @selector(mutableObjectAtSafeIndex:)); method_exchangeImplementations(oldMutableObjectAtIndex, newMutableObjectAtIndex); } - (id)objectAtSafeIndex:(NSUInteger)index { if (index > self.count - 1 || !self.count) { @try { return [self objectAtSafeIndex:index]; } @catch (NSException *exception) { NSLog(@"exception: %@", exception.reason); return nil; } }else { return [self objectAtSafeIndex:index]; } } - (id)mutableObjectAtSafeIndex:(NSUInteger)index { if (index > self.count - 1 || !self.count) { @try { return [self mutableObjectAtSafeIndex:index]; } @catch (NSException *exception) { NSLog(@"exception: %@", exception.reason); return nil; } }else { return [self mutableObjectAtSafeIndex:index]; } } @end
http://blog.csdn.net/hero_wqb/article/details/78531218