objc_msgSend()是使Objective-C面向对象的重要部分吗?

Ano*_*ser 8 objective-c

在阅读文档时,我想知道objc_msgSend()实际上是否是提供使Objective-C"面向对象"的功能的"核心技术".也许有人可以更详细地解释哪些其他部分能够实现Objective-C的面向对象范式?

bbu*_*bum 10

不是完全.

Objective-C是面向对象的,因为它将数据和功能封装在一个容器中; 一类.

这就是"面向对象编程"的全部内容.

现在,有许多不同类型的面向对象编程,一个关键方面是语言是否使用动态或静态调度.

在静态分派的语言中 - C++是最好的例子(是的,我知道它有虚拟方法提供动态调度的形式) - 方法调用在编译时连接,并且在运行时不能更改.也就是说,将用于完成方法调用的方法的实现在编译期间是固定的,并且不能在运行时更改.

使用像Objective-C这样的动态调度语言,每次调用方法时都会确定用于完成方法调用的方法的实现.因此,通过使用类别或运行时的API,可以在应用程序运行时更改方法的实现(例如,这实际上是Key Value Observation的工作原理).

objc_msgSend()是动态调度的钩子.它引用一个对象或类和一个方法名称 - 一个选择器或SEL,因为它被调用 - 并在该方法名称的对象或类上查找实现.一旦找到实现,就会调用它.

如果没有找到实现,objc_msgSend()那么将采取一系列步骤来查看类或实例是否想以某种方式处理无法识别的方法调用,允许一个对象代表另一个(代理)或类似的功能.

除此之外还有很多其他内容.我建议你阅读Apple的文档以获取更多信息.