美文网首页
底层10:Runtime-位域、共用体union

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

作者: 张无奈 | 来源:发表于2020-09-01 00:12 被阅读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的类的属性中。

相关文章

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

    Runtime:运行时 Objective_C是一门动态性比较强的编程语言,跟C、C++等语言有很大的不同。OC的...

  • iOS共用体

    iOS共用体 一、何为共用体 在C语言中有union联合体/共用体。 union中可以定义多个成员,union的大...

  • C++的共用体使用场景

    C++使用union 描述 union是C语言中一种声明共用体的数据类型,使用union声明的共用体只会占用共用体...

  • C语言的一些符号含义、 函数含义

    union:共用体/联合体 union 共用体名{成员列表};类似结构体,是一群变量的集合,和集合不同的是: 共用...

  • C语言共用体

    共用体 共用体的格式:union 共用体名称{数据类型 属性名称;数据类型 属性名称;... ...}共用体定义的...

  • 嵌入式学习笔记19.11.27

    c语言共用体: #include union st{ int x; char a; char s[10]; }st...

  • 共用体union

    union data{ int i; char ch; double d; }a,b,c; 将几种不同类型的变量...

  • union共用体

    重要特征:共用体的所有成员占用同一段内存,修改一个成员会影响其余所有成员一个有趣的应用使用共用体判断大小端 序列化...

  • isa 内部结构

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

  • 内存管理:引用计数的存储

    引用计数的存储 isa 从arm64架构开始,对isa进行了优化,变成了一个共用体(union)结构,还使用位域来...

网友评论

      本文标题:底层10:Runtime-位域、共用体union

      本文链接:https://www.haomeiwen.com/subject/ndzjsktx.html