diff --git a/AvoidCrash/NSObject+AvoidCrash.m b/AvoidCrash/NSObject+AvoidCrash.m index 0513a49..854f344 100644 --- a/AvoidCrash/NSObject+AvoidCrash.m +++ b/AvoidCrash/NSObject+AvoidCrash.m @@ -27,9 +27,52 @@ + (void)avoidCrashExchangeMethod { //setValuesForKeysWithDictionary: [AvoidCrash exchangeInstanceMethod:[self class] method1Sel:@selector(setValuesForKeysWithDictionary:) method2Sel:@selector(avoidCrashSetValuesForKeysWithDictionary:)]; + + [AvoidCrash exchangeInstanceMethod:[self class] method1Sel:@selector(forwardingTargetForSelector:) method2Sel:@selector(avoid_forwardingTargetForSelector:)]; }); - - + +} + +- (id)avoid_forwardingTargetForSelector:(SEL)aSelector{ + NSString * selStr = NSStringFromSelector(aSelector); + /** 这里主要是判断方法存在或者方法是系统实现的私有方法 */ + if([self isExistSelector:aSelector inClass:[self class]] || [selStr hasPrefix:@"_"]){ + return [self avoid_forwardingTargetForSelector:aSelector]; + }else{ + + Class stubProxy = NSClassFromString(@"stubProxy"); + if(!stubProxy){ + stubProxy = objc_allocateClassPair([NSObject class], "stubProxy", 0); + objc_registerClassPair(stubProxy); + } + class_addMethod(stubProxy, aSelector, [self unrecognizedImplementation:aSelector], [selStr UTF8String]); + Class StubProxy = [stubProxy class]; + id instance = [[StubProxy alloc]init]; + return instance; + } +} + +- (BOOL)isExistSelector:(SEL)aSelector inClass:(Class)currentClass{ + BOOL isExist = NO; + unsigned int methodCount = 0; + Method * methods = class_copyMethodList(currentClass, &methodCount); + for (int i = 0; i