如果当前类没有对应的实例方法,系统会调用如下方法,可以选择在这个时机动态添加
+(BOOL)resolveInstanceMethod:(SEL)sel {
if (sel == @selector(eat)) {
class_addMethod([self class], sel, (IMP)vc_eat, "v@:");
return YES;
}
return [super resolveInstanceMethod:sel];
}
void vc_eat(id obj,SEL _cmd) {
NSLog(@"这是Eat方法");
}
如果当前类没有对应的类方法,系统会调用如下方法,可以选择在这个时机动态添加
+(BOOL) resolveClassMethod:(SEL)sel {
if(sel == @selector(newPerson)) {
// 找到当前类的 metaClass
Class MetaClass = objc_getMetaClass([NSStringFromClass(self) UTF8String]);
class_addMethod(MetaClass,sel,(IMP)vc_newPerson,"v@:");
return YES;
}
return [super resolveClassMethod:sel];
}
void vc_newPerson(id obj,SEL _cmd) {
NSLog(@"当前是类方法 newPerson");
}
如果在当前类,以上两个方法都没有实现,可以将消息转发给其他的类处理
- (id)forwardingTargetForSelector:(SEL)aSelector {
if(aSelector == @selector(someMethod)) {
return [SomeClass new];
}
return [super forwardingTargetForSelector:aSelector];
}