什么是由GCC或Clang转换成的Objective-C 2.0类接口和实现

什么是由GCC或Clang转换成的Objective-C 2.0类接口和实现,第1张

概述由于Objective-C是C超集,因此在编译.m文件期间,所有Objective-C特定语句都将转换为C语句(我猜是由预处理器).因此,例如,像[receiver method]这样的消息表达式被转换为消息传递函数objc_msgSend(接收器,选择器)上的调用. 我的问题是:如果我有这样的类定义: @interface ClassA { int var1; float var @H_301_0@ @H_301_0@ 由于Objective-C是C超集,因此在编译.m文件期间,所有Objective-C特定语句都将转换为C语句(我猜是由预处理器).因此,例如,像[receiver method]这样的消息表达式被转换为消息传递函数objc_msgSend(接收器,选择器)上的调用.

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

@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

它是由编译器转换成的(在Objective-C的2.0版本中)?是否转换为对objc_allocateClasspair(),class_addivar(),class_addMethod()和objc_registerClasspair()等函数的调用,以便创建类,添加其实例变量,添加其方法并分别注册类(以便类struct实际上是在运行时定义的,而不是从可执行文件中作为结构加载的)?

解决方法

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,但结果代码效率低,与规则编译管道有很大不同.

@H_301_0@ 总结

以上是内存溢出为你收集整理的什么是由GCC或Clang转换成的Objective-C 2.0类接口和实现全部内容,希望文章能够帮你解决什么是由GCC或Clang转换成的Objective-C 2.0类接口和实现所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1019435.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-23
下一篇 2022-05-23

发表评论

登录后才能评论

评论列表(0条)

保存