这是我参与更文挑战的第1天,活动详情查看: 更文挑战
前言
-
想要了解本质,需要用
Clang将OC的类编译为底层的C/C++ -
Clang是基于LLVM的C/C++/Object-C的编译器,相当于是LLVM的前端 -
把⽬标
main.h⽂件编译成c++⽂件
clang -rewrite-objc main.m -o main.cpp
- UIKit报错问题:
注意SDK版本
clang -rewrite-objc -fobjc-arc -fobjc-runtime=ios-13.0.0 -isysroot /
Applications/Xcode.app/Contents/Developer/Platforms/
iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator13.0.sdk main.m
xcrun命令在clang的基础上进⾏了⼀些封装,要更好⽤⼀些
xcrun -sdk iphonesimulator clang -arch arm64 -rewrite-objc main.m -o
main-arm64.cpp (模拟器)
xcrun -sdk iphoneos clang -arch arm64 -rewrite-objc main.m -o mainarm64.cpp (⼿机)
对象是什么
- 用
xcrun -sdk iphonesimulator clang -arch arm64 -rewrite-objc WLWPerson.m -o WLWLPerson.cpp将WLWPerson.m编译生成WLWPerson.cpp
- 打开
WLWPerson.cpp, 发现代码非常的长,很难阅读。我们可以根据自己熟悉的类进行搜索定位,检索WLWPerson
图一
- 可以看出
WLWPerson实际是objc_object,对象的本质是objc_object结构体
对象底层结构
- 打开
objc4源码,检索objc_object
图二
- 可以看出结构体内部有一个
Class isa指针, 正好也对应了《图一》,WLWPerson内部除自己属性生成的_nickname成员变量外,还有一个NSObject_IVARS,所以对象第一个成员变量是一个isa指针, 我们可以打印一来验证一下
- 在没有赋值
nickname之前p前8个字节已有值这个值就是isa, 再将nickname赋值
-
可以看出第二个值就是我们的
nickname -
以上可以看出。对象内存结构跟成员变量有关系
总结
- 根据以上我们可以得出,对象的本质是一个
objc_object结构体 - 存在在对象第一个是
isa - 对象的内存结构跟成员变量有关系
疑问
- 对象内部的成员变量是如何存储的
- 对象的内存大小是多少
- 对象的是如何开辟内存的
isa里存了些什么- 对象和类有什么样的关系