4、消息转发机制
2020-07-16 本文已影响0人
Shineyok
objc_msgSend需要动态查找自己要调用哪个方法, 会根据@selector的名字动态查找对应的方法,首先在当前类的方法缓存里查找,如果查不到就去当前类的方法列表中查找,依旧查不到则去父类按同样顺序查找,直到NSObject类都没查找到,就会进入消息转发流程
1、执行+ (BOOL)resolveInstanceMethod:(SEL)sel或者+ (BOOL)resolveClassMethod:(SEL)sel进行动态方法解析,可以动态添加一个方法, 防止程序崩溃
2、执行- (id)forwardingTargetForSelector:(SEL)aSelector,快速消息转发,让其他对象处理这个函数
3、执行- (void)forwardInvocation:(NSInvocation *)anInvocation, 标准消息转发。调用forwardInvocation之前, 会执行获取方法签名方法 - (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector, 如果返回值非空则通过forwardInvocation:转发消息, 返回值为空则向当前对象发送doesNotRecognizeSelector:消息,程序崩溃退出
4、如果以上都没有进行处理,就会调用- (void)doesNotRecognizeSelector:(SEL)aSelector, 程序崩溃