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 <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
网友评论