三、联合体(共用体)和位域

本文由快学吧个人写作,以任何形式转载请表明原文出处。

一、为什么要知道联合体(共用体)和位域的概念和基础知识

在了解对象的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、定义

联合体是一种特殊的数据类型,允许我们在相同的存储位置(或者说相同的内存位置)存储不同的数据类型。

写法,或者说如何定义一个联合体 :

sql 复制代码
union [union tag] 
{ 

  member definition; 
  member definition; 
  ... 
  member definition; 
  
} [one or more union variables];

2、特点

1、联合体内的成员可以是多种类型的数据,但是同一时间点,只能有一个成员带有值。或者说同一个时间点,我们只能用到一个成员。

2、联合体占用的内存应该足够供应联合体内最大的成员的内存占用。(这里要记得内存对齐哦)

3、访问联合体内的成员,用的是成员访问运算符.(点)。

例如 :

运行结果 :

再例如 :

四、什么是位域

1、定义

位域是一种特殊的结构体成员,允许我们按位对成员进行定义,指定其占用的位数。有些信息在存储时,并不需要占用一个完整的字节,而只需占几个或一个二进制位。例如在存放一个开关量时,只有 0 和 1 两种状态,用 1 位二进位即可。为了节省存储空间,并使处理简便,C 语言又提供了一种数据结构,称为"位域"或"位段"。

写法 :

arduino 复制代码
struct
{
  unsigned int widthValidated : 1;
  unsigned int heightValidated : 1;
} status;

2、特点和使用方法

1、定义位域可以指定成员的位域宽度,即成员所占用的位数。

2、位域的宽度不能超过其数据类型的大小,因为位域必须适应所使用的整数类型。

3、位域的数据类型可以是 intunsigned intsigned int 等整数类型,也可以是枚举类型。

4、位域可以单独使用,也可以与其他成员一起组成结构体

5、位域的访问方法与普通的结构体成员一样,采用点运算符(.)。

举例 :

相关推荐
missmisslulu14 小时前
电容笔值得买吗?2024精选盘点推荐五大惊艳平替电容笔!
学习·ios·电脑·平板
GEEKVIP15 小时前
手机使用技巧:8 个 Android 锁屏移除工具 [解锁 Android]
android·macos·ios·智能手机·电脑·手机·iphone
GEEKVIP15 小时前
如何在 Windows 10 上恢复未保存/删除的 Word 文档
macos·ios·智能手机·电脑·word·笔记本电脑·iphone
奇客软件16 小时前
iPhone使用技巧:如何恢复变砖的 iPhone 或 iPad
数码相机·macos·ios·电脑·笔记本电脑·iphone·ipad
奇客软件2 天前
如何从相机的记忆棒(存储卡)中恢复丢失照片
深度学习·数码相机·ios·智能手机·电脑·笔记本电脑·iphone
GEEKVIP2 天前
如何修复变砖的手机并恢复丢失的数据
macos·ios·智能手机·word·手机·笔记本电脑·iphone
一丝晨光2 天前
继承、Lambda、Objective-C和Swift
开发语言·macos·ios·objective-c·swift·继承·lambda
GEEKVIP2 天前
iPhone/iPad技巧:如何解锁锁定的 iPhone 或 iPad
windows·macos·ios·智能手机·笔记本电脑·iphone·ipad
KWMax3 天前
RxSwift系列(二)操作符
ios·swift·rxswift
Mamong3 天前
Swift并发笔记
开发语言·ios·swift