底层10:Runtime-位域、共用体union

2020-09-01  本文已影响0人  张无奈

Runtime:运行时

Objective_C是一门动态性比较强的编程语言,跟C、C++等语言有很大的不同。

OC的动态性是有Runtime API来支持的

Runtime API提供的接口基本都是C语言的,源码由C\C++汇编语言编写

isa详解

在arm64架构之前,isa就是一个普通的指针,存储这Class,Meta-Class对象的内存地址。

从arm64架构开始,对isa进行了优化,变成了一个共用体(union)结构,还使用位域来存储更多的信息。

位与&:大家都是1才是1,其他都是0

位或|:只要有一个1就是1,其它都是0

掩码(mask):一般用来按位与运算的

|=按位或,&=按位与

二进制,右起3位分别表示高、富、帅

因为结构体是支持位域的运算的,而且会自动按顺序从低到高排序,所以进行优化:

打印如下:

再次优化,使用苹果提供的共用体union

union:共用体/联合体

union中可以定义多个成员,union的大小由最大的成员的大小决定。

union成员共享同一块大小的内存,一次只能使用其中的一个成员。

对某一个成员赋值,会覆盖其他成员的值(也不奇怪,因为他们共享一块内存。但前提是成员所占字节数相同,当成员所占字节数不同时只会覆盖相应字节上的值,比如对char成员赋值就不会把整个int成员覆盖掉,因为char只占一个字节,而int占四个字节)

union的存放顺序是所有成员都从低地址开始存放的。

Class对象,meta-Class对象地址的最后三位永远都是0

一个16进制位代表4个二进制位,如下:

什么是isa?

在arm64架构之前,isa就是一个普通的指针,存储这Class,Meta-Class对象的内存地址。

从arm64架构开始,对isa进行了优化,变成了一个共用体(union)结构,还使用位域来存储更多的信息。将一个64位的数据分开存储了很多信息,其中33位拿来存储具体的地址值

位域:

nonpointer:

0:代表普通的指针,存储这Class、Meta-Class对象的内存地址。

1:代表优化过,使用位域存储更多的信息。

has-assoc:是否有设置过关联对象,如果没有,释放时会更快。

has_cxx_dtor:是否有C++的析构函数(.cxx_destruct),如果没有,释放时会更快

shiftcls:存储这Class、Meta-Class对象的内存地址信息。

magic:用于在调试时分辨对象是否未完成初始化。

weakly_refrenced:是否被弱引用指向过,如果没有,释放时会更快。

deallocating:对象是否正在释放

extra+rc:存放引用计数器,里面存储的值引用计数器减1

has_sidetable_rc:引用计数器是否过大无法存储在isa中。如果为1,那么引用计数会存储在一个SideTable的类的属性中。

上一篇 下一篇

猜你喜欢

热点阅读