在上一章我们讲到到了在lookUpImpOrForward中,如果没有找到就会触发动态解析方法

if (slowpath(behavior & LOOKUP_RESOLVER)) {
		// 这里记录已经动态解析了
    behavior ^= LOOKUP_RESOLVER;
    return resolveMethod_locked(inst, sel, cls, behavior);
}

动态解析分为两种,对象向方法的、类方法

实现动态解析

+resolveInstanceMethod:

我们可以实现+ (BOOL)resolveInstanceMethod:方法,在方法中给对象动态添加方法

+ (BOOL)resolveInstanceMethod:(SEL)sel {
    if (sel == NSSelectorFromString(@"ffff:")) {
        class_addMethod(self, sel, (IMP)addd, "v@:@");
        return YES;
    }
    return [super resolveInstanceMethod:sel];
}

在添加方法是,我们先判断当前sel是否是需要我们添加方法,然后在进行方法添加,在添加完后return YES 结束函数调用

因为我们是给对象添加方法,而对象方法存储在class对象中,所以我们这里可以直接传self

+resolveClassMethod:

我们可以实现+ (BOOL)resolveClassMethod:方法,在方法中给class对象动态添加方法

+ (BOOL)resolveClassMethod:(SEL)sel {
    if (sel == NSSelectorFromString(@"classTest:")) {
        class_addMethod(object_getClass(self), sel, (IMP)addd, "v@:@");
        return YES;
    }
    return [super resolveInstanceMethod:sel];
}

因为我们是给对象添加方法,而对象方法存储在metaclass对象中,所以我们这里需要使用object_getClass函数获取metaclass

class_addMethod

class_addMethod(Class _Nullable cls, SEL _Nonnull name, IMP _Nonnull imp, 
                const char * _Nullable types)

给class 添加方法,这个方法根据传递是class或者metaclass进行方法添加