转自: https://www.jianshu.com/p/649792014865
1 首先根据receiver对象的isa指针获取它对应的class
2 优先在class的cache查找message方法,如果找不到,再到
methodLists查找
3 如果没有在class找到,再到super_class查找
4 一旦找到message这个方法,再依据receiver 中的self 指针找到当前的对象,调用当前对象的具体实现的方法(IMP),然后传递参数,调用实现方法。
下面这两个方法,为类(元类)动态添加方法实现。
+(BOOL)resolveInstanceMethod:(SEL)sel
+(BOOL)resolveClassMethod:(SEL)sel
//下面这个方法,将消息转发到其他对象处理。
-(id)forwardingTargetForSelector:(SEL)aSelector
下面这两个方法:
methodSignatureForSelector用来生成方法签名,这个签名就是给forwardInvocation中的参数NSInvocation调用的。
错误unrecognized selector sent to instance的原因,就是因为methodSignatureForSelector这个方法中,由于没有找到run对应的实现方法,所以返回了一个空的方法签名,最终导致程序报错崩溃。
所以我们需要做的是自己新建方法签名,再在forwardInvocation中用你要转发的那个对象调用这个对应的签名,这样也实现了消息转发。
-(NSMethodSignature*)methodSignatureForSelector:(SEL)selector;
-(void)forwardInvocation:(NSInvocation*)invocation;
作者:心至靜行至遠
链接:https://www.jianshu.com/p/649792014865
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
网友评论