gpt4 book ai didi

objective-c - 什么是GCC或Clang转换成的Objective-C 2.0类接口(interface)和实现

转载 作者:太空狗 更新时间:2023-10-30 03:40:26 24 4
gpt4 key购买 nike

由于 Objective-C 是 C 超集,所有 Objective-C 特定语句在编译 .m 文件期间都被转换为 C 语句(我猜是通过预处理器)。因此,例如,像 [receiver method] 这样的消息表达式被转换为对消息传递函数 objc_msgSend(receiver, selector) 的调用。

我的问题是:如果我有这样的类定义:

@interface ClassA {
int var1;
float var2;
id var3;
}

-(void) method1;
-(int) method2: (int) num1;
@end

@implementation ClassA
-(void) method1 {
// Implementation of the method
}

-(int) method2: (int) num1 {
// Implementation of the method
}

@end

编译器(在 2.0 版本的 Objective-C 中)将它转换成什么?它是否转换为对函数的调用,例如 objc_allocateClassPair()class_addIvar()class_addMethod()objc_registerClassPair(),为了分别创建类、添加它的实例变量、添加它的方法和注册类(这样类结构实际上是在运行时定义的,而不是作为结构从可执行文件中加载的)?

最佳答案

Since Objective-C is a C superset, all Objective-C specific statements are converted into C statements during the compiling of a .m file (by the preprocessor, I guess).

在 1988 年确实如此。虽然 Objective-C 可以仍然以这种方式编译,但已经很久没有了。

编译器解析 Objective-C,连同 C 和 - 有时 - C++,并发出抽象语法树 [AST] 表示后预处理输出。该 AST 非常直接地包含了各种 Objective-C 定义。

请注意,GCC 的编译细节和 LLVM 的编译细节是不同的。

如果您查看编译后的输出,您会看到 mach-o 文件——可执行产品——在文件中有多个部分包含 Objective-C 元数据,包括类定义、选择器表、ivar 布局等...编译器将此元数据生成到 .o 文件中,然后链接器将它们混合在一起,消除重复信息(不是重复符号),然后写入 mach-o。

正如有人在另一个问题中提到的,您可以使用 Objective-C 重写器将 Objective-C 重写为纯 C,但生成的代码效率低下并且与规范编译管道有很大不同。

关于objective-c - 什么是GCC或Clang转换成的Objective-C 2.0类接口(interface)和实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11847639/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com