isa与类关联的原理

Clang编译器

  • clang是一个由Apple主导编写,基于LLVM的C/C++/OC的编译器

  • 主要是用于底层编译,将一些文件``输出成c++文件,例如main.m 输出成main.cpp,其目的是为了更好的观察底层的一些结构 及 实现的逻辑,方便理解底层原理。

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

  • 编译UIKit库: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

xcode安装的时候顺带安装了xcrun命令,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 main- arm64.cpp(手机)

联合体位域(共用体)

联合体也是由不同的数据类型组成,但其变量是互斥的,所有的成员共占一段内存。而且共用体采用了内存覆盖技术,同一时刻只能保存一个成员的值,如果对新的成员赋值,就会将原来成员的值覆盖掉

  • 结构体与联合体的区别
    内存占用情况:
    1)、结构体的各个成员会占用不同的内存,互相之间没有影响
    2)、共用体的所有成员占用同一段内存,修改一个成员会影响其余所有成员
    内存分配大小:
    1)、结构体内存 >= 所有成员占用的内存总和(成员之间可能会有缝隙)
    2)、共用体占用的内存等于最大的成员占用的内存

对象的本质

  • main中创建一个LGPerson类,并通过Clang编译成C++文件,编译后的文件部分内容是:
//NSObject的定义
@interface NSObject  {
    Class isa  OBJC_ISA_AVAILABILITY;
}
//NSObject 的底层编译
struct NSObject_IMPL {
    Class isa;
};
//LGPerson的底层编译
struct LGPerson_IMPL {
    struct NSObject_IMPL NSObject_IVARS; // 等效于 Class isa;
    NSString *_name;
};

struct NSObject_IMPL NSObject_IVARS;这个就是isa,继承自NSObject(属于伪继承),直接将NSObject结构体定义为LGPerson的第一个属性通过这种方式LGPerson就就成了NSObject的所有内容。

  • isa的类型为什么是class
    alloc开辟内存流程中有个initInstanceIsa方法,该方法中不难看出,是通过isa_t 初始化isa指针;
    在获取isa的方法中,系统底层将isa.bitsISA_MASK做&运算得出结果强制转换成class类型,方便开发理解。

cls与isa关联原理

clsisa关联原理就是isa指针中的shiftcls位域中存储了类信息,其中initInstanceIsa的过程是将 calloc指针 和当前的 类cls关联起来;

你可能感兴趣的:(isa与类关联的原理)