objc在向一个对象发送消息时,runtime库会根据对象的isa指针找到该对象实际所属的类,然后在该类中的方法列表以及其父类方法列表中寻找方法运行,然后在发送消息的时候,objc_msgSend方法不会返回值,所谓的返回内容都是具体调用时执行的
1 如果没有实现方法
第一步调用以下方法
+ (BOOL)resolveInstanceMethod:(SEL)sel{
if(sel ==@selector(test)) {
添加方法
class_addMethod(<#Class _Nullable __unsafe_unretained cls#>, <#SEL _Nonnull name#>, <#IMP _Nonnull imp#>, <#const char * _Nullable types#>)
returnYES;
}
return [super resolveInstanceMethod:sel];
}
2 如果上面的方法没有实现 ,就调用下面的方法
- (id)forwardingTargetForSelector:(SEL)aSelector{
if(aSelector ==@selector(test)) {
return[[WEIalloc]init];
}
return [super forwardingTargetForSelector:aSelector];
}
3 如果上面的方法没有实现 ,就调用下面的两个方法
- (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector{
if(aSelector ==@selector(test)) {
return [NSMethodSignature signatureWithObjCTypes:@"v16@:8"];
}
return [super methodSignatureForSelector:aSelector];
}
- (void)forwardInvocation:(NSInvocation*)anInvocation{
anInvocation.target= [[WEialloc]init];
[anInvocationinvoke];
}
- (void)doesNotRecognizeSelector:
网友评论