swift指针内存管理-引用

news2024/11/16 7:50:43

引用探究

首先看一个例子

在这里插入图片描述

那么这个 0x0000000000000003 是什么意思呢

回到swift源码

找到关键核心类型

在这里插入图片描述

HeapObject 就是 swift 分配内存获取到的结构类型

在这里插入图片描述

HeapObject 第一个8字节为 metadata, 接下来是宏

在这里插入图片描述

在这里插入图片描述

InlineRefCounts 其实 就是泛型真正类型 InlineRefCountBits

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

至此,通过源码,最终找到了 uint64 64位的位信息, 这64位位信息里,存储了当前运行声明周期相关的引用计数

alloc - 引用计数

当swift 创建一个object,引用计数究竟是多少呢

继续回到源码,探索底层原理本身就是枯燥乏味的

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

此时,就与上面开始探究的 类型 RefCountBits 关联上了

在这里插入图片描述

根据 RefCountBits(0, 1) 找到 相对应的RefCountBits 构造函数

strongExtracount :: 0

unownedCount:: 1

这几个左移就比较有意思了,出现了 宏拼接参数,需要有点耐心

在这里插入图片描述

在这里插入图片描述

整理一下 StrongExtraRefCountShift = shiftAfterField(IsDeiniting)

define shiftAfterField(name) (name##Shift + name##BitCount)

StrongExtraRefCountShift = IsDeinitingShift + IsDeinitingBitCount

PureSwiftDeallocShift = 0

UnownedRefCountShift = shiftAfterField(PureSwiftDealloc)

UnownedRefCountShift = PureSwiftDeallocShift + PureSwiftDeallocBitCount

UnownedRefCountShift = 1

const size_t IsDeinitingShift = shiftAfterField(UnownedRefCount)

IsDeinitingShift = UnownedRefCountShift + UnownedRefCountBitcount

UnownedRefCountBitCount = 31

IsDeinitingShift = 1 + 31 = 32

IsDeinitingBitCount = 1

StrongExtraRefCountShift = 32 + 1 = 33

最终

StrongExtraRefCountShift = 33

PureSwiftDeallocShift = 0

UnownedRefCountShift = 1

0 << 33 = 0 强引用计数

1 << 0 = 1

1 << 1 = 2 无主引用计数

这样 bit 64位就是 0x0000000000000003, 与开始我们打印的obj1实例内存第二个 8字节存储的内容是一致的

增加实例引用

在这里插入图片描述

在obj1开辟内存创建之后,增加了 obj2 obj3 两个对象对 obj1的引用之后

obj1实例指针 指向的内存空间 第二个8字节中的 高32位 存储了 4

此时就是 两个强引用计数 2 << 33. 就是高32位的4

如果 只增加一个 引用 去掉obj3 的引用,结果就是 1 << 33. 高32位存储 2

在这里插入图片描述

此时, 把obj1变成可选类型,obj1 赋值为nil的时候,实例指针指向的内存空间引用计数的变化如何

在这里插入图片描述

强引用计数 0<< 33 = 0, 高32位显示为0

低位 无主引用为 1<<1 = 2. 加上 1<<0 = 1, 低32位显示为3

此时 obj1 = nil

在这里插入图片描述

32位的1标识此时,obj1正在释放

在这里插入图片描述

源码中查看 强引用计数逻辑

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

也就是每增加一次引用, 就在原有计数的基础上 加上 (1<<33)

循环引用

跟OC一样,强引用必然可能造成循环引用的问题

swift 中采用两种方式解决循环引用的问题,弱引用 与 无主引用

由于弱引用不会强持有对实例的引用,所以说实例被释放了,弱引用仍旧引用着这个实例也是有可能的。因此,ARC会在被引用的实例被释放时,自动设置弱引用为nil

由于弱引用需要允许它们的值为nil,所以一定是可选类型

在这里插入图片描述

查看下汇编

在这里插入图片描述

继续查看源码

在这里插入图片描述

weak 修饰的变量,相当于一个 WeakReference 对象

在这里插入图片描述
在这里插入图片描述

其实就是创建了一个sidetable, 本质上与OC ios-弱引用是差不多的

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

HeapObjectSideTableEntry 结构

在这里插入图片描述

swift中弱引用逻辑

如果当前是强引用,就采用 strong RC + unowned RC + flags, 也就是 强引用 + 无主引用 + flags

如果是弱引用,就是 HeapObjectSideTableEntry结构

而 HeapObjectSideTableEntry 就是 strong RC + unowned RC + weak RC + flags

也就是原64位 强引用信息 + 32位弱引用信息

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

SideTableRefCounts 与 InlineRefCounts 都是相同的模板

在这里插入图片描述

弱引用之后,存储变化

在这里插入图片描述

0xC00000002040C84E 读取

在这里插入图片描述

62位 63位 为1

回看前面的逻辑

在这里插入图片描述

散列表的存储 >> 3 , 右移了3位

62 63 变0,恢复结果

在这里插入图片描述
然后再左移3位

在这里插入图片描述

最终读取还原后的 散列表地址 0x102064270

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/32367.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Android性能优化方法论

作为一名开发&#xff0c;性能优化是永远绕不过去的话题&#xff0c;在日常的开发中&#xff0c;我们可肯定都会接触过。Android 的性能优化其实是非常成熟的了&#xff0c;成熟的套路&#xff0c;成熟的方法论&#xff0c;成熟的开源框架等等。 对于接触性能优化经验较少的开…

大学生简单个人静态HTML网页设计作品 DIV布局个人介绍网页模板代码 DW学生个人网站制作成品下载

&#x1f389;精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业…

APS计划排程结果的量化评价

APS计划排程系统是供应链管理软件中的一种提升管理决策协助系统软件&#xff0c;它通过约束理论、运用多种多样数学分析优化计算方法、有常驻运行内存运转的互动式计算机软件。它借助于某些繁杂的数学运算方式 来处理多种多样自变量&#xff0c;使供应链管理的提升变成事实。 A…

计硕3班-陈陇刚-2022222278-第二章 递归与分治策略 作业

目录 1. 概括第二章学习内容&#xff0c;总结第二章学习心得 1.1 递归 1.1.1 递归的定义 1.1.2 递归的使用场景 1.2 分治 1.2.1 分治的定义 1.2.2 分治法使用场景 1.3 学习心得 2. 描述Fibonacci数列递归算法&#xff0c;并进行时间复杂度分析 2.1 Fibonacci数列定义 …

测试人经验谈:需求不明确也能写出测试用例

测试人员的用例编写&#xff0c;一般基于经验和需求文档进行&#xff0c;但是很多时候项目是没有需求的&#xff0c;特别是领导的某个概念提出&#xff0c;然后开发会根据自己的理解完成&#xff0c;测试人员在没有获得任何依据和需求的情况下如何编写测试用例呢&#xff1f; …

【数据结构】七种排序方法,一篇文章掌握

文章目录前言1. 直接插入排序1.1 画图演示1.2 直接插入排序详细步骤1.3 时间复杂度&#xff0c;空间复杂度分析2. 希尔排序2.1 具体步骤描述2.2 代码详解2.3时间复杂度,空间复杂度分析3. 选择排序3.1 画图讲解3.2 代码讲解3.3 时间复杂度,空间复杂度分析4. 快速排序4.1 画图演示…

【C++初阶7-string】真方便,真舒服

前言 本期浅学一下STL的stirng。 内容概览&#xff1a; STLstring 是什么为什么怎么用&#xff08;接口介绍及使用&#xff09; 博主水平有限&#xff0c;不足之处望请斧正&#xff01; 先导 STL C中非常重要的一个东西&#xff0c;STL(Standard Template Library) 标准…

详解华夏银行iDo平台一体化运维的落地过程

随着数字化转型的深入&#xff0c;基于中台和PaaS架构的一体化运维建设也在各行各业快速展开&#xff0c;但是如何将运维平台本身的能力与企业已有的工具能力进行中台化整合、工具场景如何联动&#xff0c;是个复杂而庞大的工程。 本次&#xff0c;史春志老师以华夏银行运维平…

【Revit二次开发】元素(Element)

图元与图元类型元素元素 元素(Element)也称图元 图元作为revit建模的基础&#xff0c;数量庞大&#xff0c;关系千丝万缕。先了解图元的分类&#xff0c;将会帮助我们整理思路&#xff0c;找到功能开发的关键点。 每一个人都可以按照自己的思路将图元进行分类。建模人员可以按…

vue详细教程

原文链接&#xff1a;https://www.cnblogs.com/MrFlySand/p/16921017.html 02vue的安装 程序说明 1、在body中有2个counter&#xff0c;一个是id&#xff0c;一个是class。 2、创建应用&#xff0c;分别用id和class将配置对象传入 语法&#xff1a;Vue.createApp(方法名).mount…

DPDK之PMD原理

PMD是Poll Mode Driver的缩写&#xff0c;即基于用户态的轮询机制的驱动。本文将介绍PMD的基本原理。 在不考虑vfio的情况下&#xff0c;PMD的结构图如下&#xff1a; 图1. PMD结构图 虽然PMD是在用户态实现设备驱动&#xff0c;但还是依赖于内核提供的策略。其中uio模块&…

Java 面试题 —— TCP 粘包、拆包问题

Java 面试题 —— TCP 粘包、拆包问题 1、粘包、拆包问题概况 正常情况&#xff1a; ​  服务端一共接收到客户端的两个数据包&#xff0c;两个数据包各自包含完整的消息。 粘包问题&#xff1a; ​  服务端一共接收到客户端的一个数据包&#xff0c;这个数据包共包含两条…

【java进阶06:数组】使用一维数组模拟栈数据结构 使用二维数组模拟酒店,酒店管理系统 Arrays工具类 冒泡排序算法、选择排序算法、二分法

目录 数组 二维数组 总结 作业 Arrays工具类 数组 数组总结 及 静态初始化一维数组 /* Array:1、java语言中的数组是一种引用数据类型&#xff0c;不属于基本数据类型&#xff0c;数组的父类是Object2、数组实际上是一个容器&#xff0c;可以同时容纳多个元素&#xff08…

【负荷预测、电价预测】基于神经网络的负荷预测和价格预测(Matlab代码实现)

&#x1f468;‍&#x1f393;个人主页&#xff1a;研学社的博客 &#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜…

Webpack DevServerExpress 中间件

前言 webpack-dev-server 底层是 express webpack-dev-middleware。 express是基础。 webpack-dev-middleware是中间件&#xff0c;以监听模式启动 webpack&#xff0c;将编译后的文件输出到内存&#xff08;使用fs-memory&#xff09;&#xff0c;沟通webpack的HRM&#xf…

机器学习之特征提取

Question Orientied:来自论文的一个学习点 Feature extraction 定义&#xff1a; 特征提取是指使用计算机提取图像中属于特征性的信息的方法及过程。 简言之 提取图像关键信息。 特征提取出来的结果叫特征向量。 进入主题之前 普及几个常识&#xff1a; 像素的英文名称:Pixe…

Flutter 完全手册

小册介绍 Flutter 作为一个跨平台的框架&#xff0c;其开发技术栈融合了 Native 和前端的技术&#xff0c;不仅涉及到了 Native&#xff08;Android、iOS &#xff09;的开发知识&#xff0c;又吸取了很多前端&#xff08;例如 React&#xff09;的技术理念和框架&#xff0c;并…

甘露糖-聚乙二醇-CY3 Cy3-PEG-mannose

甘露糖-聚乙二醇-CY3 Cy3-PEG-mannose 中文名称&#xff1a;甘露糖-荧光染料CY3 英文名称&#xff1a;mannose-Cyanine3 别称&#xff1a;CY3标记甘露糖&#xff0c;CY3-甘露糖 溶解性&#xff1a;溶于大部分有机溶剂&#xff0c;如&#xff1a;DCM、DMF、DMSO、THF等等。在…

业务数据分析-Excel数据透视表(四)

目录 1、什么是数据透视表 2、如何操作 3、数据透视表的优势 4、适用什么场景 5、使用前注意事项 1、什么是数据透视表 先来举个例子 看下面这段对话 下午5点30 boss&#xff1a;把这张表给我整理成如下格式&#xff0c;就是根据平台给我汇总一下销量和收入&#xff0c…

机械工程基础笔记整理

第一章 绪论 第一节 课程的特点 1. 综合性 本课结合了工程力学&#xff0c;机械工程材料&#xff0c;常用机构&#xff0c;支撑零部件&#xff0c;机械传动&#xff0c;液压传动&#xff0c;气压传动的相关知识。 2. 基础性 无论从事机械制造&#xff0c;还是使用研究机械&…