Skip to content

Latest commit

 

History

History
54 lines (42 loc) · 1.29 KB

15.第十五题.md

File metadata and controls

54 lines (42 loc) · 1.29 KB

15. Runtime 消息解析

如果当前类没有对应的实例方法,系统会调用如下方法,可以选择在这个时机动态添加

+(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];
}