iOS消息发送的调用过程

2020-11-18  本文已影响0人  林风098

iOS方法的调用过程

[object methodA]
runtime层会将这个方法翻译成
objc_msgSend(id self, SEL op, ...)
而objc_msgSend具体如何进行分发呢?

1.方法先经过缓存查找,方法列表查找后,后进入动态方法解析阶段

+ (BOOL)resolveInstanceMethod:(SEL)sel;
- (BOOL)resolveInstanceMethod:(SEL)sel;

如果类没有实现这个方法,那么消息就没有转送,就进行类和对象的动态方法决议。
为发送消息的对象的添加一个IMP,然后再让该对象去处理
如果实现了这个方法,会接受到一个bool值,表示转发是否成功。

- (id)forwardingTargetForSelector:(SEL)aSelector;//返回接受的对象

如果3方法没有实现就会走到这边,快速消息转发

将该消息转发给能处理该消息的对象

这个主要作用是:这个方法这个类没有实现,但是我知道其他的类实现了,就把这个类的方法转发给其他类。操作无效依旧crash

- (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector //返回一个方法签名

- (void)forwardInvocation:(NSInvocation *)anInvocation //方法实现操作

如果4方法没有实现,就会走到这里慢速消息转发

第一个方法生成方法签名,然后创建
NSInvocation 对象作为参数给第二个方法,然后在forwardInvocation 方法里面做消息处理,
只要在第二个方法里面不执行父类的方法,即使不处理也不会崩溃

5.unrecognized selector sent to instance
如果上述所有都没有实现就会crash,并报出如下信息。

整体流程图


16056839197261.jpg 16056854954116.jpg

具体使用可用于两个方面
1.防止循环引用。
2.AOP切面工程。

上一篇下一篇

猜你喜欢

热点阅读