Objective-C在编译之前是否转换为C代码?

Is Objective-C converted to C code before compilation?

我知道目标C是C的严格超集,我们在写同样的东西。但当我写的时候

1
2
@interface Myintf {}
@end

它是否被转换为C结构,或者由目标C编译器准备的数据结构myintf的内存布局与在runtime.h中定义的C结构的内存布局相同?

关于objc_msgsend的同样问题

苹果文件上说

In Objective-C, messages aren’t bound to method implementations until runtime. The compiler converts a message expression, into a call on a messaging function, objc_msgSend. This function takes the receiver and the name of the method mentioned in the message—that is, the method selector—as its two principal parameters:


Does it get converted to a C struct

在过去,它曾经是,但在现代运行时(OS X 10.5+64位和iOS)中,我认为它有点复杂。它不能使用传统的struct,因为脆弱的实例变量问题得到了解决。

and same question about objc_msgsend

对。所有方法调用(或者更准确地说,所有消息发送)都转换为对obj_msgsend()的调用(当使用不同的C函数时,super用作接收器时除外)。

请注意,Objective-C的早期实现是作为预处理器实现的,并作为中间步骤生成C源代码。现代编译器并不为此烦恼,直接从Objective-C源代码转换为目标代码格式。


否和否。这两种情况最终都依赖于运行时。在某种程度上,它被转换为使用C接口,但是引入了一个抽象级别——它不是完全静态的。

它将有助于查看编译器生成的程序集,以更详细地了解这是如何工作的。

根据声明:

1
id objc_msgSend(id theReceiver, SEL theSelector, ...);

当实现调用方法时,编译器插入对objc_msgSend的调用。它不是简化为静态C函数调用,而是动态调度——另一个间接级别,如果您愿意这样想的话。