1.消息的传递
objc_msgSend()函数会一句接受者(调用方法的对象)的类型和选择子(方法名)来调用适当的方法。
在class中会先去cache中 通过SEL查找对应函数method(cache中method列表是以SEL为key通过hash表来存储的,这样能提高函数查找速度),若 cache中未找到。再去class中的消息列表methodList中查找,若methodlist中未找到,则取superClass中查找。若能找到,则将method加 入到cache中,以方便下次查找,并通过method中的函数指针跳转到对应的函数中去执行,如果在类及其继承体系中都没有找到,那么就会进入到消息的转发。
2.消息的转发
+ (BOOL)resolveClassMethod:(SEL)selector
修改方法
- (id)forwardingTargetForSelector:(SEL)selector
修改方法的调用
- (void)forwardInvocation:(NSInvocation *)invocation
修改方法及其调用者
如果这3个都没有处理,那么就会doesNotRecognizeSelector抛出异常