Runtime的消息转发机制就不班门弄斧了,有很多资料。
我单独说一下,拦截未实现方法引起的奔溃
以控制器为例,其他的原理类似
1、写一个UIViewController的分类,重写-(id)forwardingTargetForSelector:(SEL)aSelector方法,
#import "UIViewController+test.h"
#import "testController.h"
#import <objc/runtime.h>
@implementation UIViewController (test)
-(id)forwardingTargetForSelector:(SEL)aSelector
{
if (![self respondsToSelector:aSelector]) {
return [testController new];
}
return [super forwardingTargetForSelector:aSelector];
}
2、写一个类专门解决这个问题
如何创建类就不赘述了,主要是重写方法+(BOOL)resolveInstanceMethod:(SEL)sel,(resolveClassMethod与其类似,不单独写了)动态添加了一个方法,替换没有实现的。
+(BOOL)resolveInstanceMethod:(SEL)sel
{
if (![self respondsToSelector:sel]) {//如果没有响应就把imp换成我们新的imp,使APP不奔溃
class_addMethod(self, sel, (IMP)myMethod, "v@:");//动态添加方法
}
return YES;
}
void myMethod(id obj, SEL _cmd) {
NSLog(@"Objective-C");
}
一般使用场景是上架后不能及时更新的app
网友评论