OC_底层_isa探究

isa与类关联的原理

OC对象的本质

先简单简介llbd相关知识:

lldb

在代码中探索对象本质:

@interface LGPerson : NSObject
@property (nonatomic, copy) NSString *name;
@end

@implementation LGPerson
@end
//1、将 main.m 编译成 main.cpp
clang -rewrite-objc main.m -o main.cpp

//2、将 ViewController.m 编译成  ViewController.cpp
clang -rewrite-objc -fobjc-arc -fobjc-runtime=ios-13.0.0 -isysroot / /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator13.7.sdk ViewController.m

//以下两种方式是通过指定架构模式的命令行,使用xcode工具 xcrun
//3、模拟器文件编译
- xcrun -sdk iphonesimulator clang -arch arm64 -rewrite-objc main.m -o main-arm64.cpp 

//4、真机文件编译
- xcrun -sdk iphoneos clang -arch arm64 -rewrite-objc main.m -o main- arm64.cpp 

在 main.cpp 中:

//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;
};

OC对象的本质其实就是结构体`

LGPerson中的isa是继承自NSObject中的isa

objc_setProperty 源码探索

img
img
img

总结 :

img

联合体(union)

结构体和联合体的区别

内存占用情况

  • 结构体的各个成员会占用不同的内存,互相之间没有影响
  • 共用体的所有成员占用同一段内存,修改一个成员会影响其余所有成员

内存分配大小

  • 结构体内存 >= 所有成员占用的内存总和(成员之间可能会有缝隙)
  • 共用体占用的内存等于最大的成员占用的内存

isa的类型 isa_t

union isa_t { //联合体
    isa_t() { }
    isa_t(uintptr_t value) : bits(value) { }
    //提供了cls 和 bits ,两者是互斥关系
    Class cls;
    uintptr_t bits;
#if defined(ISA_BITFIELD)
    struct {
        ISA_BITFIELD;  // defined in isa.h
    };
#endif
};

isa 中 存储信息如下:

img

验证 isa 指针 位域 (0-64)

isa 和 类 的关联

验证方式:

initIsa 方法
isa & ISA_MSAK
object_getClass
位运算

本文参考
Style_月月
链接:https://www.jianshu.com/p/7fd6241a7124

你可能感兴趣的:(OC_底层_isa探究)