在上一章我们讲到到了在lookUpImpOrForward中,如果没有找到就会触发动态解析方法
if (slowpath(behavior & LOOKUP_RESOLVER)) {
// 这里记录已经动态解析了
behavior ^= LOOKUP_RESOLVER;
return resolveMethod_locked(inst, sel, cls, behavior);
}
动态解析分为两种,对象向方法的、类方法
我们可以实现+ (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
我们可以实现+ (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 _Nullable cls, SEL _Nonnull name, IMP _Nonnull imp,
const char * _Nullable types)
给class 添加方法,这个方法根据传递是class或者metaclass进行方法添加