OC消息转发

2021-03-04  本文已影响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

来源:简书

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

上一篇下一篇

猜你喜欢

热点阅读