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的类的属性中。
网友评论