// // NSMutableArray+AvoidCrash.m // https://github.com/chenfanfang/AvoidCrash // // Created by mac on 16/9/21. // Copyright © 2016年 chenfanfang. All rights reserved. // #import "NSMutableArray+AvoidCrash.h" #import "AvoidCrash.h" @implementation NSMutableArray (AvoidCrash) + (void)avoidCrashExchangeMethod { static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ Class arrayMClass = NSClassFromString(@"__NSArrayM"); //objectAtIndex: [AvoidCrash exchangeInstanceMethod:arrayMClass method1Sel:@selector(objectAtIndex:) method2Sel:@selector(avoidCrashObjectAtIndex:)]; //objectAtIndexedSubscript if (AvoidCrashIsiOS(11.0)) { [AvoidCrash exchangeInstanceMethod:arrayMClass method1Sel:@selector(objectAtIndexedSubscript:) method2Sel:@selector(avoidCrashObjectAtIndexedSubscript:)]; } //setObject:atIndexedSubscript: [AvoidCrash exchangeInstanceMethod:arrayMClass method1Sel:@selector(setObject:atIndexedSubscript:) method2Sel:@selector(avoidCrashSetObject:atIndexedSubscript:)]; //removeObjectAtIndex: [AvoidCrash exchangeInstanceMethod:arrayMClass method1Sel:@selector(removeObjectAtIndex:) method2Sel:@selector(avoidCrashRemoveObjectAtIndex:)]; //insertObject:atIndex: [AvoidCrash exchangeInstanceMethod:arrayMClass method1Sel:@selector(insertObject:atIndex:) method2Sel:@selector(avoidCrashInsertObject:atIndex:)]; //getObjects:range: [AvoidCrash exchangeInstanceMethod:arrayMClass method1Sel:@selector(getObjects:range:) method2Sel:@selector(avoidCrashGetObjects:range:)]; }); } //================================================================= // array set object at index //================================================================= #pragma mark - get object from array - (void)avoidCrashSetObject:(id)obj atIndexedSubscript:(NSUInteger)idx { @try { [self avoidCrashSetObject:obj atIndexedSubscript:idx]; } @catch (NSException *exception) { [AvoidCrash noteErrorWithException:exception defaultToDo:AvoidCrashDefaultIgnore]; } @finally { } } //================================================================= // removeObjectAtIndex: //================================================================= #pragma mark - removeObjectAtIndex: - (void)avoidCrashRemoveObjectAtIndex:(NSUInteger)index { @try { [self avoidCrashRemoveObjectAtIndex:index]; } @catch (NSException *exception) { [AvoidCrash noteErrorWithException:exception defaultToDo:AvoidCrashDefaultIgnore]; } @finally { } } //================================================================= // insertObject:atIndex: //================================================================= #pragma mark - set方法 - (void)avoidCrashInsertObject:(id)anObject atIndex:(NSUInteger)index { @try { [self avoidCrashInsertObject:anObject atIndex:index]; } @catch (NSException *exception) { [AvoidCrash noteErrorWithException:exception defaultToDo:AvoidCrashDefaultIgnore]; } @finally { } } //================================================================= // objectAtIndex: //================================================================= #pragma mark - objectAtIndex: - (id)avoidCrashObjectAtIndex:(NSUInteger)index { id object = nil; @try { object = [self avoidCrashObjectAtIndex:index]; } @catch (NSException *exception) { NSString *defaultToDo = AvoidCrashDefaultReturnNil; [AvoidCrash noteErrorWithException:exception defaultToDo:defaultToDo]; } @finally { return object; } } //================================================================= // objectAtIndexedSubscript: //================================================================= #pragma mark - objectAtIndexedSubscript: - (id)avoidCrashObjectAtIndexedSubscript:(NSUInteger)idx { id object = nil; @try { object = [self avoidCrashObjectAtIndexedSubscript:idx]; } @catch (NSException *exception) { NSString *defaultToDo = AvoidCrashDefaultReturnNil; [AvoidCrash noteErrorWithException:exception defaultToDo:defaultToDo]; } @finally { return object; } } //================================================================= // getObjects:range: //================================================================= #pragma mark - getObjects:range: - (void)avoidCrashGetObjects:(__unsafe_unretained id _Nonnull *)objects range:(NSRange)range { @try { [self avoidCrashGetObjects:objects range:range]; } @catch (NSException *exception) { NSString *defaultToDo = AvoidCrashDefaultIgnore; [AvoidCrash noteErrorWithException:exception defaultToDo:defaultToDo]; } @finally { } } @end