本文由快学吧个人写作,以任何形式转载请表明原文出处。
一、为什么要知道联合体(共用体)和位域的概念和基础知识
在了解对象的alloc办法的时候,知道了alloc做了三件事,请求内存、字节对齐和绑定isa,请求内存和字节对齐已经了解过了,而绑定isa还没有了解,isa的实质就是一个联合体(共用体),所以想要知道为何绑定isa,绑定了isa有什么用,就需要知道isa的实质,和了解isa的实质。
二、如何知道isa是一个联合体(共用体)
资料 : objc4-876,地址 : github.com/LGCooci/KCO…
这儿没有用最新的objc4-876,原因有两个,1、找不到能够编译的源码。2、我的电脑版本是11.1,objc4-818.2有能够编译的源码,环境适配。
isa的结构,818和876没有区别,通用,所以不存在版本差异。
1、思路
从alloc初始化那里进入,由于那里最了解。
查找道路 : 用xcode的find功能,查818源码的alloc {
–> 进入_objc_rootAlloc
–> callAlloc
–> _objc_rootAllocWithZone
–> _class_createInstanceFromZone
(这儿又进到了alloc的核心办法)–>initInstanceIsa
–> InitIsa
进入到如下图的代码 :
2、isa的结构
进入isa_t
,结构如下图 :
不需要看其他的,只需要知道isa是一个union
类型的对象。union
就是联合体,也叫共用体,是C的概念。
三、什么是联合体(共用体)
1、界说
联合体是一种特别的数据类型,答应我们在相同的存储位置(或者说相同的内存位置)存储不同的数据类型。
写法,或者说如何界说一个联合体 :
union [union tag]
{
member definition;
member definition;
...
member definition;
} [one or more union variables];
2、特色
1、联合体内的成员能够是多种类型的数据,但是同一时间点,只能有一个成员带有值。或者说同一个时间点,我们只能用到一个成员。
2、联合体占用的内存应该满足供应联合体内最大的成员的内存占用。(这儿要记得内存对齐哦)
3、拜访联合体内的成员,用的是成员拜访运算符
.
(点)。
例如 :
运转成果 :
再例如 :
四、什么是位域
1、界说
位域是一种特别的结构体成员,答应我们按位对成员进行界说,指定其占用的位数。有些信息在存储时,并不需要占用一个完整的字节,而只需占几个或一个二进制位。例如在存放一个开关量时,只要 0 和 1 两种状况,用 1 位二进位即可。为了节省存储空间,并使处理简洁,C 语言又供给了一种数据结构,称为”位域”或”位段”。
写法 :
struct
{
unsigned int widthValidated : 1;
unsigned int heightValidated : 1;
} status;
2、特色和使用办法
1、界说位域能够指定成员的位域宽度,即成员所占用的位数。
2、位域的宽度不能超过其数据类型的大小,由于位域有必要适应所使用的整数类型。
3、位域的数据类型能够是
int
、unsigned int
、signed int
等整数类型,也能够是枚举类型。4、位域能够独自使用,也能够与其他成员一同组成结构体
5、位域的拜访办法与普通的结构体成员相同,采用点运算符(.)。
举例 :