消息传递和消息转发

2019-08-13  本文已影响0人  愤怒的牛牛

当调用一个方法 run 之后

oc方法会转变为objc_msgSend(id theReceiver, SEL selectot,……);

判断receiver是否为nil,如果是nil的话则不往下执行,返回nil,这就是为什么在oc中一个nil发送消息不会引起奔溃。

1、从方法的缓存中查找被调用过的方法会存在缓存里面,每个类都会有一个表来存被调用过的方法,以便下次更快的调用。

2、从本类的方法表(dispatch table)中查找方法寻找selector,找到则写入缓存,返回方法。否则再从父类中查找方法,如此往复,直到达到基类。如果找不到则执行方法的动态解析。

3、方法的动态解析:调用+ (BOOL)resolveInstanceMethod:(SEL)sel方法来查看是否能够返回一个selector,如果存在则返回selector。不存在进入下一步。

4、备用接受者- (id)forwardingTargetForSelector:(SEL)aSelector这个方法来询问是否有接受者可以接受这个方法呀。如果有人接受,则交给它处理,就好像一切都没发生过一样。

5.选择器方法签名- (NSMethodSignature*)methodSignatureForSelector:(SEL)aSelector这个方法返回签名

选择器方法签名

6、方法的转发:如果到这一步还不能够找到相应的Selector的话,就要进行完整的方法转发过程。调用方法-(void)forwardInvocation:(NSInvocation *)anInvocation

最后还是没有找到的话就只有呵呵了,这时候unrecognized selector sent to instance 0x100111df0'的错误就来了。

愤怒的牛牛的简书

愤怒的牛牛的新浪博客

愤怒的牛牛的GitHub

上一篇 下一篇

猜你喜欢

热点阅读