消息传递在Objective-C中如何工作–刘关山–中等
消息传递在Objective-C中的工作方式
调用Objective-C方法时,该方法将转换为objc_msgSend函数。 objc_msgSend是objc / message.h文件中定义的C函数。 第一个参数是接收的Objective-C对象本身,第二个参数是选择器,其余参数是传递给Objective-C方法的参数。 该过程称为消息传递。 objc_msgSend函数确定在运行时如何处理到接收对象的消息。
大致是objc_msgSend函数的工作方式:
- 如果接收对象为nil,则将消息重定向到nil接收器(如果有)。 默认行为是什么也不做。
- 检查类的缓存。 如果实现已被缓存,请调用它。
- 将选择器与类中定义的选择器进行比较。 如果找到匹配项,则调用匹配的实现。 否则,请检查其超类,直到没有超类为止。
- 呼叫+ resolveInstanceMethod: / + resolveClassMethod : 。 如果返回“是”,则表示选择器将解决这个问题。 因此,请转到步骤2并重新开始。 在这里,您可以调用class_addMethod来动态提供给定选择器的实现。
- 致电-forwardingTargetForSelector:。 如果返回非零,则将消息发送到返回的对象。 请注意, 此处返回自身将导致无限循环。
- 调用– methodSignatureForSelector : 。 如果返回非nil,则创建一个NSInvocation实例,并将其传递给-forwardInvocation:。
- 找不到指定选择器的实现。 它将在接收对象上调用– didNotRecognizeSelector:。 默认实现会引发异常。