我知道您使用[]向对象发送消息,然后将其转换为objc_msgSend()
,这需要指向对象的指针作为其第一个参数,第二个参数需要一个选择器。
但是消息类如何呢?
[myClass doSomething];
它不是指向对象的指针,它是如何工作的?
答案 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的消息,包括超类继承的方法。如果它响应它将执行该方法。