Runtime的消息轉發(fā)機制就不班門弄斧了,有很多資料。
我單獨說一下,攔截未實現(xiàn)方法引起的奔潰
以控制器為例,其他的原理類似
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、寫一個類專門解決這個問題
如何創(chuàng)建類就不贅述了,主要是重寫方法+(BOOL)resolveInstanceMethod:(SEL)sel,(resolveClassMethod與其類似,不單獨寫了)動態(tài)添加了一個方法,替換沒有實現(xiàn)的。
+(BOOL)resolveInstanceMethod:(SEL)sel
{
if (![self respondsToSelector:sel]) {//如果沒有響應就把imp換成我們新的imp,使APP不奔潰
class_addMethod(self, sel, (IMP)myMethod, "v@:");//動態(tài)添加方法
}
return YES;
}
void myMethod(id obj, SEL _cmd) {
NSLog(@"Objective-C");
}
一般使用場景是上架后不能及時更新的app