跳到主要内容

简述objc 在向一个对象发送消息时,发生了什么 ?

参考答案:

在 Objective-C 中,向一个对象发送消息是一个核心且独特的概念。当你向一个对象发送消息时,实际上是在执行以下步骤:

  1. 编译时处理:在编写代码时,你会使用类似于 [object messageName:parameter]; 的语法来向对象发送消息。这里的 object 是消息的接收者,messageName 是选择子(selector),而 parameter 是传递给消息的参数。在编译阶段,编译器并不会直接生成对特定方法的调用,而是将消息发送转换为对 objc_msgSend 函数的调用。这是 Objective-C 运行时机制的一部分,它允许动态的消息分发。
  2. 运行时查找:当程序运行时,objc_msgSend 函数会根据接收者的类和选择子在运行时系统中查找对应的方法实现。这个过程包括在接收者所属类的方法列表中查找,如果没有找到,则沿着类的继承体系继续向上查找,直到找到合适的方法实现或者到达根类。如果最终都没有找到匹配的方法,那么会执行消息转发机制。
  3. 方法调用:一旦找到了与选择子对应的方法实现,objc_msgSend 函数就会调用这个方法,并将参数传递给它。这个调用是动态的,意味着你可以在运行时改变一个类的行为,只需添加、删除或替换方法实现即可。
  4. 动态性:Objective-C 的这种消息发送机制是其动态性的核心体现。它允许在运行时改变对象的行为,这对于构建灵活、可扩展的应用程序非常有用。例如,你可以使用类别(categories)或协议(protocols)在运行时向现有类添加新方法,而无需修改类的原始代码。

总的来说,当在 Objective-C 中向一个对象发送消息时,实际上是在利用运行时系统的动态消息分发机制来查找并执行对应的方法。这种机制为 Objective-C 提供了强大的灵活性和扩展性。