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
来源: http://www.bubuko.com/infodetail-2490793.html