Objective c 向班级发送消息是如何工作的?

Objective c 向班级发送消息是如何工作的?,objective-c,class,object,Objective C,Class,Object,我知道您使用[]向对象发送消息,然后将其转换为objc_msgSend(),它需要一个指向对象的指针作为第一个参数,第二个参数需要一个选择器 但是像这样的消息传递类呢 [myClass doSomething] 它不是一个指向对象的指针,那么它是如何工作的呢?Mike Ash对objc\u msgSend的工作原理有很好的解释:。实际上,当你向一个类发送一条消息时,你实际上是在向一个类对象发送该消息,这个类对象的行为与任何其他对象一样,有一些限制 来自苹果的: 在Objective-C中,类本身

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

但是像这样的消息传递类呢
[myClass doSomething]

它不是一个指向对象的指针,那么它是如何工作的呢?

Mike Ash对
objc\u msgSend
的工作原理有很好的解释:。

实际上,当你向一个类发送一条消息时,你实际上是在向一个类对象发送该消息,这个类对象的行为与任何其他对象一样,有一些限制

来自苹果的:

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


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

我假设
myClass
是(字面上)类的名称(尽管类通常以大写字母开头;我假设这是一个不遵循命名约定的类)

Objective-C中的消息发送语法有两种情况。您提到的一种情况是,如果左侧是一个表达式,其计算结果是指向对象的指针;消息被发送到该对象。第二,如果左侧是一个标识符,它是一个类的名称,那么编译器将向该类的类对象发送消息。更严格地说,编译器将传递一个指向类对象的指针作为
objc\u msgSend()
的第一个参数。这是可能的,因为编译器为每个类安排类对象的结构和位置,所以它知道该类对象的地址

直观地说,您可以想到
[myClass doSomething]类似于

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


除了不需要执行运行时查找来获取指向类对象的指针之外,编译器在编译时知道该指针。

类也是对象。我知道,但它们不是指向对象的指针。是的,它们是。“对象”只是一个内存块,前4(或8)个字节包含一个isa字段(以前称为isa指针,但64位ARM改变了这一点)。您可以手动分配内存,直接设置isa字段,然后向“对象”发送消息。类有一个指向元类的isa,它通过objc\msgSendSee可以使它变得凌乱,以获取this@iccir:那么作为对象指针的类指向哪里呢。对不起,如果我要求这么多,我很好奇。谢谢你的链接和答案,伙计。你能解释一下你所说的类对象吗?因为我想我现在已经理解了。顺便说一句,谢谢你的回答。@MiguelC:class对象就是表示类的对象。通过向类对象发送消息来调用类方法。在类方法中,
self
指向调用它的类对象。我不知道你特别想知道什么。
Class foo = NSClassFromString(@"myClass");
[foo doSomething];