美文网首页
OC消息转发

OC消息转发

作者: 阳光天天耀 | 来源:发表于2021-03-04 14:45 被阅读0次

    转自: 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

    来源:简书

    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

    相关文章

      网友评论

          本文标题:OC消息转发

          本文链接:https://www.haomeiwen.com/subject/ejlkqltx.html