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,并报出如下信息。
整体流程图
具体使用可用于两个方面
1.防止循环引用。
2.AOP切面工程。