返回
OC - Runtime & objc_msgSend()分析
IOS
2023-12-17 16:26:15
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()的调用过程如下:
objc_msgSend()
首先检查接收消息的对象是否实现了消息选择器指定的方法。- 如果对象实现了该方法,则
objc_msgSend()
直接调用该方法。 - 如果对象没有实现该方法,则
objc_msgSend()
会尝试通过消息转发机制来调用该方法。
4. 总结
Runtime
是Objective-C
中用来程序运行时信息的一套机制。Runtime
在编译时和运行时都起着重要的作用。Runtime
提供了三种调用方法:直接调用、间接调用和动态调用。objc_msgSend()
是Objective-C
中发送消息的函数。objc_msgSend()
的调用过程如下:- 检查接收消息的对象是否实现了消息选择器指定的方法。
- 如果对象实现了该方法,则直接调用该方法。
- 如果对象没有实现该方法,则尝试通过消息转发机制来调用该方法。