Lui*_*BOL 6 cocoa objective-c objective-c-runtime
由于Objective-C是C超集,因此在编译.m文件期间,所有Objective-C特定语句都将转换为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
Run Code Online (Sandbox Code Playgroud)
它是由编译器转换成的(在Objective-C的2.0版本中)?它是转换成电话上一样的功能objc_allocateClassPair(),class_addIvar(),class_addMethod()并且objc_registerClassPair(),为了分别创建类,添加它的实例变量,增加它的方法和注册类,(所以该类结构在运行系统中实际定义,而不是被加载为从可执行文件中获取结构)?
bbu*_*bum 14
由于Objective-C是C超集,因此在编译.m文件期间,所有Objective-C特定语句都将转换为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,但结果代码效率低,与规则编译管道有很大不同.
| 归档时间: |
|
| 查看次数: |
197 次 |
| 最近记录: |