消息传递在Objective-C中如何工作–刘关山–中等

消息传递在Objective-C中的工作方式

调用Objective-C方法时,该方法将转换为objc_msgSend函数。 objc_msgSend是objc / message.h文件中定义的C函数。 第一个参数是接收的Objective-C对象本身,第二个参数是选择器,其余参数是传递给Objective-C方法的参数。 该过程称为消息传递。 objc_msgSend函数确定在运行时如何处理到接收对象的消息。

大致是objc_msgSend函数的工作方式:

  1. 如果接收对象为nil,则将消息重定向到nil接收器(如果有)。 默认行为是什么也不做。
  2. 检查类的缓存。 如果实现已被缓存,请调用它。
  3. 将选择器与类中定义的选择器进行比较。 如果找到匹配项,则调用匹配的实现。 否则,请检查其超类,直到没有超类为止。
  4. 呼叫+ resolveInstanceMethod: / + resolveClassMethod : 。 如果返回“是”,则表示选择器将解决这个问题。 因此,请转到步骤2并重新开始。 在这里,您可以调用class_addMethod来动态提供给定选择器的实现。
  5. 致电-forwardingTargetForSelector:。 如果返回非零,则将消息发送到返回的对象。 请注意, 此处返回自身将导致无限循环。
  6. 调用– methodSignatureForSelector : 。 如果返回非nil,则创建一个NSInvocation实例,并将其传递给-forwardInvocation:。
  7. 找不到指定选择器的实现。 它将在接收对象上调用– didNotRecognizeSelector:。 默认实现会引发异常。