iOS运行时消息的传递与转发

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抛出异常

你可能感兴趣的:(iOS运行时消息的传递与转发)