一、Clang
- Clang是一个C语言、C++、Objective-C语言的轻量级编译器。源代码发布于BSD协议下。 Clang将支持其普通lambda表达式、返回类型的简化处理以及更好的处理constexpr关键字。
- Clang是一个由Apple主导编写,基于LLVM的C/C++/Objective-C编译器。
用终端输入clang -rewrite-objc main.m -o main.cpp,将main文件编译成cpp文件。-o为输出
二、对象的本质
探索的对象本质的步骤
2.1创建项目
2.2在main.m添加代码
@interface Student : NSObject
@end
@implementation Student
@end
2.3生成main.cpp文件
在main的根目录下,点击go2Shell文件,输入clang -rewrite-objc main.m -o main.cpp,将main.m文件编译成cpp文件。
2.4查看main.cpp文件
编译成了结构体。
2.5添加属性,再探cpp文件
@property(nonatomic,strong)NSString *stuName;
@property(nonatomic,strong)NSString *stuSex;
结构体struct Student_IMPL
struct Student_IMPL {
struct NSObject_IMPL NSObject_IVARS;
NSString *_stuName;
NSString *_stuSex;
};
set方法
- static NSString * _I_Student_stuName
- static NSString * _I_Student_stuSex
get方法
- static void I_Student_setStuName
- static void I_Student_setStuSex
底层代码中,Student被编译成了结构体存在,其属性成为结构体中变量存在,有set和get方法。对象的本质其实是结构体。
三、ISA的结构
源码文件https://github.com/zhaimengting/objc4
isa.h文件
# if __arm64__
# define ISA_MASK 0x0000000ffffffff8ULL
# define ISA_MAGIC_MASK 0x000003f000000001ULL
# define ISA_MAGIC_VALUE 0x000001a000000001ULL
# define ISA_BITFIELD \
uintptr_t nonpointer : 1; \
uintptr_t has_assoc : 1; \
uintptr_t has_cxx_dtor : 1; \
uintptr_t shiftcls : 33; /*MACH_VM_MAX_ADDRESS 0x1000000000*/ \
uintptr_t magic : 6; \
uintptr_t weakly_referenced : 1; \
uintptr_t deallocating : 1; \
uintptr_t has_sidetable_rc : 1; \
uintptr_t extra_rc : 19
# define RC_ONE (1ULL<<45)
# define RC_HALF (1ULL<<18)
- nonpointer:表示是否对isa指针开启指针优化,0表示纯isa指针,1:不止是类对象地址,isa中包含了类信息、对象的引用计数。占一个位
- has_assoc :标识关联对象,0没有,1存在。
-
has_cxx_dtor:该对象是否有 C++ 或者 Objc 的析构器,如果有析构函数,则需要做析构逻辑,
如果没有,则可以更快的释放对象 - shiftcls:存储了类指针的值,开启优化的状态下,在arm64架构中有33位来存储类指针。
- magic:用于调试器判断当前对象是真的对象,或者是没有初始化的空间
- weakly_referenced:指对象是否是否被指向或者指向一个ARC的弱变量,没有弱引用的对象可以更快的释放。
- deallocating:标识对象是否正在释放内存。
- has_sidetable_rc:当对象引用计数大于10时,则需要借用该变量存储进位。
- extra_rc: 表示该对象的引用计数值,实际上是引用计数值减1,例如如果对象的计数引用为10,那么extra_rc为9,如果大于10,则需要用到上面的has_sidetable_rc.