【问题标题】:What is an Objective-C 2.0 class interface and implementation converted into by GCC or Clang什么是由 GCC 或 Clang 转换成的 Objective-C 2.0 类接口和实现
【发布时间】:2012-08-07 13:58:34
【问题描述】:

由于 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() 等函数的调用,以便分别创建类、添加其实例变量、添加其方法和注册类(这样类struct 实际上是在运行时定义的,而不是作为 struct 从可执行文件中加载)?

【问题讨论】:

    标签: objective-c cocoa objective-c-runtime


    【解决方案1】:

    由于 Objective-C 是 C 的超集,所有 Objective-C 特定的语句 在编译 .m 文件期间转换为 C 语句(通过 我猜是预处理器)。

    在 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,但生成的代码效率低下,并且与规则编译管道有很大不同。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-10
      • 2015-05-18
      相关资源
      最近更新 更多