2012-08-07 31 views
6

由于目标C为C超集,所有的Objective-C特定语句一个.m文件的编译时转化成C语句(由预测器,我猜)。因此,例如,将消息表达式[receiver method]转换为消息功能objc_msgSend(receiver, selector)上的呼叫。什么是一个Objective-C 2.0类接口和实现转换成GCC或锵

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

@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(),以分别创建类,添加它的实例变量,增加它的方法和注册类,(所以该类结构在运行系统中实际定义的,而不是从可执行文件加载为结构体)?

回答

14

由于目标C为C超集,所有的Objective-C特定语句 被一个.m文件的编译(由 预处理器,我想)时转化成C语句。

,在1988年是真实而Objective-C的可以仍然以那种方式编译,它一直没有在很长一段时间。

编译器解析的Objective-C,其中C而且 - sometimes-- C++一起,并且发射一个抽象语法树[AST],它表示后预处理输出。 AST非常直接地包含了各种Objective-C定义。

注意,GCC的编译和LLVM的编译的细节分歧。

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

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

相关问题