1、对象的本质
Clang
- Clang是一个
C++编写、基于LLVM、发布于LLVM BSD协议许可证下的C/C++/Objective-C/Objective-C++轻量级编译器 - 与GNU C语言规范几乎完全兼容,并增加额外语法特性,如C函数重载(通过__attribute__(overloadable)来修饰函数)
- Clang将支持其普通Iambda表达式、返回类型的简化处理以及更好的处理
constexpr关键字 - Clang命令
clang rewrite-objc main.m(目标文件) -o main.cpp(编译文件)把目标文件编译成C++文件- fatal error: ‘UIKit/UIKit.h’ file not found报错: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
-
‘Xcode’安装的时候也顺带安装了’xcrun’命令,’xcrun’命令在’Clang’的基础上进行了一些封装,更好用
-
xcrun -sdk iphonesimulator clang -arch x86_64 -rewrite-objc main.m(目标文件) -o main-arm64.cpp(自定义编译文件名)(模拟器) -
xcrun -sdk iphoneos clang -arch arm64 -rewrite-objc main.m(目标文件) -o main-arm64.cpp(自定义编译文件名)(手机)
对象的本质
通过上边的操作得到的编译文件可知:对象的本质就是结构体




- 底层编译内容

2、结构体、联合体(共用体)、位域
结构体struct
- 所有变量是”共存”的
- 优点:全面,都可以赋值
- 缺点:内存空间分配是粗放的,不管用不用全部分配

联合体union
- 各变量是”互斥”的
- 缺点:只有最新被赋值的一个变量正常,之前的变量内存不再使用成为脏内存
- 优点:内存使用更精细,节省内存空间

位域:n
- 成员后加:n(n为希望占用的位数)

3、指针Isa

inline void
objc_object::initIsa(Class cls)
{
initIsa(cls, false, false);
}
复制代码
inline void
objc_object::initIsa(Class cls, bool nonpointer, UNUSED_WITHOUT_INDEXED_ISA_AND_DTOR_BIT bool hasCxxDtor)
{
ASSERT(!isTaggedPointer());
isa_t newisa(0); //
if (!nonpointer) {
newisa.setClass(cls, this);
} else {
ASSERT(!DisableNonpointerIsa);
ASSERT(!cls->instancesRequireRawIsa());
#if SUPPORT_INDEXED_ISA
ASSERT(cls->classArrayIndex() > 0);
newisa.bits = ISA_INDEX_MAGIC_VALUE;
// isa.magic is part of ISA_MAGIC_VALUE
// isa.nonpointer is part of ISA_MAGIC_VALUE
newisa.has_cxx_dtor = hasCxxDtor;
newisa.indexcls = (uintptr_t)cls->classArrayIndex();
#else
newisa.bits = ISA_MAGIC_VALUE;
// isa.magic is part of ISA_MAGIC_VALUE
// isa.nonpointer is part of ISA_MAGIC_VALUE
# if ISA_HAS_CXX_DTOR_BIT
newisa.has_cxx_dtor = hasCxxDtor;
# endif
newisa.setClass(cls, this);
#endif
newisa.extra_rc = 1;
}
// This write must be performed in a single store in some cases
// (for example when realizing a class because other threads
// may simultaneously try to use the class).
// fixme use atomics here to guarantee single-store and to
// guarantee memory order w.r.t. the class index table
// ...but not too atomic because we don't want to hurt instantiation
isa = newisa;
}
复制代码
union isa_t { //isa_t是个联合体
isa_t() { }
isa_t(uintptr_t value) : bits(value) { }
uintptr_t bits;
private:
// Accessing the class requires custom ptrauth operations, so
// force clients to go through setClass/getClass by making this
// private.
Class cls;
public:
#if defined(ISA_BITFIELD)
struct {
ISA_BITFIELD; // defined in isa.h
};
bool isDeallocating() {
return extra_rc == 0 && has_sidetable_rc == 0;
}
void setDeallocating() {
extra_rc = 0;
has_sidetable_rc = 0;
}
#endif
void setClass(Class cls, objc_object *obj);
Class getClass(bool authenticated);
Class getDecodedClass(bool authenticated);
};
复制代码


nonPointerIsa
- 类 指针8字节、64位,只存储地址过于浪费,所以苹果为了优化内存,将引用计数、weak、关联对象、是否正在释放、析构函数等信息存到64位的指针里
nonpointor:表示是否对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,则需要使用has_sidetable_rc
Isa推导Class
- 对象通过其isa与掩码
ISA_MASK做”与”操作,可得到指针内部的class信息


- 内存开辟后没释放则位置不变,所以要拿到
类指针shiftcl可以通过对指针进行位运算,将右侧3位清空,再将左侧17位也清空再复原类指针shiftcl位置后得到:(对对象x/4gx查看内存: 0x10068ac90内存整体情况: 0x011d800100008475首地址为指针0x0000000000000000存放的内容)

- Isa指针64位具体分布

© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END























![[桜井宁宁]COS和泉纱雾超可爱写真福利集-一一网](https://www.proyy.com/skycj/data/images/2020-12-13/4d3cf227a85d7e79f5d6b4efb6bde3e8.jpg)

![[桜井宁宁] 爆乳奶牛少女cos写真-一一网](https://www.proyy.com/skycj/data/images/2020-12-13/d40483e126fcf567894e89c65eaca655.jpg)