如何向课程发送消息?

时间:2013-10-16 10:03:49

标签: objective-c class object

我知道您使用[]向对象发送消息,然后将其转换为objc_msgSend(),这需要指向对象的指针作为其第一个参数,第二个参数需要一个选择器。

但是消息类如何呢? [myClass doSomething]; 它不是指向对象的指针,它是如何工作的?

4 个答案:

答案 0 :(得分:1)

Mike Ash对objc_msgSend的工作方式有很好的解释:Friday Q&A 2012-11-16: Let's Build objc_msgSend

答案 1 :(得分:1)

实际上,当您向类发送消息时,实际上是将该消息发送到类对象,该对象的行为与具有某些限制的任何其他对象一样。

来自Apple的reference

  

在Objective-C中,类本身就是一个名为opaque类型的对象   类。类不能使用声明定义属性   前面为实例显示的语法,但它们可以接收消息。

答案 2 :(得分:1)

我假设myClass(字面上)是一个类的名称(虽然通常类以大写字母开头;我假设这是一个不遵循命名约定的类。)< / p>

Objective-C中有两种消息发送语法。你提到的一个是左边是一个表达式,它是一个指向一个对象的指针;消息将发送到该对象。第二个,如果左侧是一个标识符,它是一个类的名称,那么编译器会将消息发送给该类的类对象。从技术上讲,编译器会将指向类对象的指针作为objc_msgSend()的第一个参数传递。这是可能的,因为编译器为每个类排列类对象的结构和位置,因此它知道该类对象的地址。

直观地说,您可以将[myClass doSomething];视为与

相似
Class foo = objc_getClass("myClass");
[foo doSomething];

Class foo = NSClassFromString(@"myClass");
[foo doSomething];

除了它不需要进行运行时查找以获取指向类对象的指针 - 编译器在编译时知道指针。

答案 3 :(得分:0)

运行时将消息转换为SEL然后检查该类是否响应具有该SEL的消息,包括超类继承的方法。如果它响应它将执行该方法。