对象的本质

首先要了解一下clang
Clang 是一个C语言、C++Objective-C语言的轻量级编译器。源代码发布于BSD协议下。Clang将支持其普通lambda表达式、返回类型的简化处理以及更好的处理constexpr关键字。
Clang是一个由Apple主导编写,基于LLVMC/C++/Objective-C编译器
20134月,Clang已全面支持C++11标准,并开始实现C++1y特征(也就是C++14,这是C++的下一个小更新版本)。Clang将支持其普通lambda表达式、返回类型的简化处理以及更好的处理contexpr关键字。[2]
Clang是一个C++编写、基于LLVM、发布于LLVM BSD许可证下的C/C++/Objective-C/Objective-C++编译器,它与GNU C语言规范几乎完全兼容(当然,也有部分不兼容的内容,包括编译命令选项也会有点差异),并在此基础上增加了额外的语法特征,比如C函数重载(通过__attribute__((overloadable))来修饰函数,其目标(之一)就是超越GCC

clang -rewrite-objc main.m -o main.cpp 把目标文件编译成c++文件

UIKit报错问题

clang -rewrite-objc-fobjc-arc-runtime=iOS-13.0.0-isysroot/Applications/Xcode.app/Contens/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator13.0.sdk main.m

xcode安装的时候顺带安装了xcrun命令,xcode命令在clang的基础上进行了一些封装,要更好用一些

xcrun -sdk iphonesimulator clang -arch x86_64 -rewrite-objc main.m -o main.cpp(模拟器)
xcrun -sdk iphones clang -arch arm64 -rewrite-objc main.m -o main.cpp (真机)

由于OC是基于CC++上层的超体,可通过Clang还原OC在底层的实现

新建一个项目创建一个YDPerson类并在main.m中创建YDPerson对象如下

打开item客户端,并cdmain.m文件所在目录执行xcrun -sdk iphonesimulator clang -arch x86_64 -rewrite-objc main.m -o main.cpp,可看到在main.m文件生成了main.cpp的文件,打开main.capp文件查找YDPerson的对象

通过编译发现YDPerson被编译成了YDPerson_IMPL,那就是说对象底层的本质就是结构体,真的吗?我们可以再添加一个属性nickName的属性测试一下

再次编译后发现新添加的属性在struct YDPerson_IMPL中出现了,再次证实对象在底层的本质是结构体

结构体中的struct NSObject_IMPL NSObject_IVARS其实就是从NSObject继承的isa,而在代码中有typedef struct objc_object LGPerson这样的代码,即LGPersonstruct objc_object这样的类型这是什么含义呢,其实在OC层面的继承是NSObject,而objc在底层真正的实现是objc_object,那么类Class在底层是什么类型呢?

通过编译后的源码发现Class其实是struct objc_class *类型,而objc_class其实继承于objc_object,这在objc的底层源码中是可以找到的

id 其实是struct objc_object *类型,这也是为什么id类型不用*号的原因

_I_YDPerson_nickName就是属性nickNamegetter方法,_I_YDPerson_setNickName_就是属性nickNameset方法,那方法里的self+ OBJC_IVAR_$_YDPerson$_nickName又是什么呢?

因为对象的内存在堆上,对象的内存存储的就是isanickName这样一个一个的成员变量,而要想获取到nickName的值就得先获取到对象YDPerson在内存的首地址地址,然后通过内存相应的大小找到nickName所在的存储空间,最后再获取里面的值,那nickNameset方法为什么不是通过内存平移的形式而是调用了objc_setProperty呢,其实这是系统在底层对copy修饰的属性进行了单独的处理,在后面章节中会来验证。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容