返回

OC - Runtime & objc_msgSend()分析

IOS

1. Runtime的编译时和运行时

Objective-C中,Runtime是用来OC程序运行时的信息,它包含了程序中所有类和对象的元数据,以及一些用于操纵这些元数据的函数。Runtime在编译时和运行时都起着重要的作用。

  • 编译时:

    • Runtime用于检查代码的语法正确性。
    • Runtime用于生成程序的二进制代码。
  • 运行时:

    • Runtime用于动态加载和链接类。
    • Runtime用于动态创建和销毁对象。
    • Runtime用于动态解析方法。
    • Runtime用于动态转发消息。

2. Runtime的三种调用方式

  • 直接调用:

    • 直接调用是最简单的一种调用方式,它直接通过函数指针调用方法。
    • 直接调用的优点是效率高,但缺点是它只能调用已知的方法。
  • 间接调用:

    • 间接调用是通过消息发送机制来调用方法的。
    • 间接调用的优点是它可以调用未知的方法,但缺点是它比直接调用效率低。
  • 动态调用:

    • 动态调用是通过反射机制来调用方法的。
    • 动态调用的优点是它可以调用任何方法,但缺点是它比间接调用效率更低。

3. objc_msgSend()分析

  • objc_msgSend()Objective-C中发送消息的函数。
  • objc_msgSend()的第一个参数是接收消息的对象。
  • objc_msgSend()的第二个参数是消息选择器。
  • objc_msgSend()的其余参数是消息的参数。
  • objc_msgSend()的返回值是方法的返回值。

objc_msgSend()的调用过程如下:

  1. objc_msgSend()首先检查接收消息的对象是否实现了消息选择器指定的方法。
  2. 如果对象实现了该方法,则objc_msgSend()直接调用该方法。
  3. 如果对象没有实现该方法,则objc_msgSend()会尝试通过消息转发机制来调用该方法。

4. 总结

  • RuntimeObjective-C中用来程序运行时信息的一套机制。
  • Runtime在编译时和运行时都起着重要的作用。
  • Runtime提供了三种调用方法:直接调用、间接调用和动态调用。
  • objc_msgSend()Objective-C中发送消息的函数。
  • objc_msgSend()的调用过程如下:
    1. 检查接收消息的对象是否实现了消息选择器指定的方法。
    2. 如果对象实现了该方法,则直接调用该方法。
    3. 如果对象没有实现该方法,则尝试通过消息转发机制来调用该方法。