OC类编译成cpp文件的分析

OC类编译成cpp文件的分析,第1张

为了编译情况,需要了解一些 常见的 clang 命令

可以看出类的内存:

在OBJC_CLASS_SETUP_$_LGPerson LGPerson的赋值函数中。

cache被赋值了_objc_empty_cache

相关参考和验证: isa的探究

存储着累定义的成员变量,属性,方法,协议数据。相当于源码中的class_ro_t。 由此可以理解 class_ro_t 是编译过程中已经确定的了,可以计算类的空间大小。

struct LGPerson_IMPL 可以看作一个实例对象的世纪内存:

属性会在数量列表中,也会在成员列表中。另外属性也会生成对应的get/set方法。根据修饰词的不同,调用objc_setProperty 并传入不同的参数

在oc中定义的方法,生成了对应的C函数。第一个参数是对象地址。然后会被存储到class_ro_t 的方法列表中

_class_t是类的结构体。有四个成员

使用 clang -rewrite-objc 名称生成oc类对应的编译的cpp文件,主要是为了配合源码学习和了解类的属性,成员变量,方法,协议是怎么存储以及对应到oc源码中的。

因为在学习oc语言block的底层原理,所以需要将oc的.m转成c++的.cpp格式文件,这样可以方便我们窥探一些本质的东西

比如要将我的工程BlockTest的main.m转换成.cpp, *** 作如下

1:打开终端 cd 自己的工程文件

2:终端输入:clang -x objective-c -rewrite-objc -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk xxx.m,其中xxx.m替换成自己需要转换的文件,然后敲回车

3:回到自己的工程文件目录下查看,会多了一个.cpp文件

4:将文件添加到工程目录

5:从编译器中移除.cpp,保证项目正常运行

swift与OC混编的总结

现在的swift开发多数会用到混编。swift和oc是通过桥接文件来实现的。无论是在oc创建的项目中还中创建swift文件,还是在swift文件中创建oc文件,第一次都会自动提示建立桥接文件。名字为:xxx-Bridging-Header.h,并且自动添加文件路径。如果是导入另一只中语言的第三方库,就不会自动生成桥接文件,这时候就需要自己建立一个桥接文件。第一步:新建一个”.h”文件,也就是新建中的”Header.h“文件,名字可以模仿系统的写法”xxx(demo名字)-Bridging-Header.h“;第二步,桥接文件路径,在设置Build Settings 中搜索Bridging,结果中Objective-C Brindging Header 中拖入文件路径(前面的可以写成$(SRCROOT)/,这样就会自动生成项目文件路径,不会因为换了电脑就找不到文件路径),编译一下,就可以了。

在oc项目中引用swift文件,只需导入头文件

#import "项目名字-Swift.h"

1

1

这个文件是隐藏的,在工程中看不见。导入这个文件后就可以在oc使用swift写的类了。

在swift文件中引用oc的类,在桥接文件中引入需要引用oc的类的头文件,编译一下,就可以使用oc的类了。


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

原文地址: https://outofmemory.cn/yw/8104716.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-13
下一篇 2023-04-13

发表评论

登录后才能评论

评论列表(0条)

保存