1

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

@interface Myintf {}
@end

它是否被转换为 C 结构,还是由 Objective c 编译器准备的数据结构 Myintf 的内存布局与 runtime.h 中定义的 C 结构的内存布局相同?

和关于 objc_msgsend 的相同问题

苹果文件说

在 Objective-C 中,消息直到运行时才绑定到方法实现。编译器将消息表达式转换为对消息传递函数 objc_msgSend 的调用。 该函数将接收者和消息中提到的方法的名称(即方法选择器)作为它的两个主要参数:

4

2 回答 2

3

它是否被转换为 C 结构

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

和关于 objc_msgsend 的相同问题

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

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

于 2012-04-11T07:53:16.983 回答
2

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

查看编译器生成的程序集以更详细地了解其工作原理将有所帮助。

鉴于声明:

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

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

于 2012-04-11T07:07:41.827 回答