weak的底层原理

weak 引用在 iOS 中通过维护一个全局的弱引用表来实现。当弱引用的对象被释放时,所有指向它的弱引用会被自动置为 nil,从而防止悬挂指针。
弱引用表(Weak Table)的键和值
理解弱引用表的键和值对于理解
weak引用的底层机制非常重要。下面我详细解释一下这两个概念,并用示例和图表来说明。
键(Key)
- 对象指针(Object Pointer):这是被
weak引用的对象的内存地址。每个被weak引用的对象在弱引用表中都有一个对应的条目,其键就是这个对象的内存地址。
值(Value)
- 弱引用指针集合(Set of Weak Reference Pointers):这是一个集合,包含了所有指向该对象的
weak引用指针的地址。当一个对象有多个weak引用时,这些引用指针的地址都会记录在集合中。
具体示例
示例代码
Person *personInstance = [[Person alloc] init];
__weak Person *weakPerson1 = personInstance;
__weak Person *weakPerson2 = personInstance;
在这个示例中:
personInstance是一个Person对象的强引用。weakPerson1和weakPerson2是Person对象的两个弱引用。
弱引用表表示
- 创建弱引用时:
- 假设
personInstance的内存地址是0x1000。 weakPerson1的内存地址是0x2000。weakPerson2的内存地址是0x3000。
- 假设
Weak Table:
+-------------------+-------------------+
| Object Pointer | Weak Reference(s) |
+-------------------+-------------------+
| 0x1000 | [0x2000, 0x3000] | // personInstance is referenced by weakPerson1 and weakPerson2
+-------------------+-------------------+
在这个弱引用表中:
- 键
0x1000是personInstance的内存地址。 - 值
[0x2000, 0x3000]是一个集合,包含了所有指向personInstance的弱引用指针(weakPerson1和weakPerson2的地址)。
对象释放时
当 personInstance 的引用计数变为零,系统准备释放该对象时,运行时会执行以下操作:
-
找到所有弱引用:
- 在弱引用表中查找键
0x1000,找到对应的值[0x2000, 0x3000]。
- 在弱引用表中查找键
-
置
nil:- 将
0x2000和0x3000地址上的值置为nil。
- 将
-
删除条目:
- 从弱引用表中删除键
0x1000的条目。
- 从弱引用表中删除键
Weak Table (before release):
+-------------------+-------------------+
| Object Pointer | Weak Reference(s) |
+-------------------+-------------------+
| 0x1000 | [0x2000, 0x3000] |
+-------------------+-------------------+Weak Table (after release):
+-------------------+-------------------+
| Object Pointer | Weak Reference(s) |
+-------------------+-------------------+
| (nil) | [nil, nil] | // personInstance 已被释放,weakPerson1 和 weakPerson2 被置为 nil
+-------------------+-------------------+
关键函数
在实现弱引用机制时,运行时系统使用以下关键函数:
libobjc中的一系列 API
objc_initWeak:初始化一个弱引用,将其添加到弱引用表中。objc_loadWeak:读取一个弱引用的值,确保在对象被释放后返回nil。objc_storeWeak:给弱引用赋值,并更新弱引用表。objc_destroyWeak:销毁一个弱引用,并从弱引用表中移除对应的条目。
概述
弱引用表的键是被引用对象的内存地址,而值是一个集合,包含了所有指向该对象的弱引用指针的地址。当对象被释放时,运行时会在弱引用表中找到所有指向该对象的弱引用,并将它们置为 nil,然后删除对应的条目。通过这种机制,iOS 保证了 weak 引用的安全性和可靠性。
相关文章:
weak的底层原理
weak 引用在 iOS 中通过维护一个全局的弱引用表来实现。当弱引用的对象被释放时,所有指向它的弱引用会被自动置为 nil,从而防止悬挂指针。 弱引用表(Weak Table)的键和值 理解弱引用表的键和值对于理解 weak 引用的底层机制非常重…...
03-3.1.3 栈的链式存储的实现
👋 Hi, I’m Beast Cheng👀 I’m interested in photography, hiking, landscape…🌱 I’m currently learning python, javascript, kotlin…📫 How to reach me --> 458290771qq.com 喜欢《数据结构》部分笔记的小伙伴可以订…...
传输协议TCP-原理部分
传输控制协议TCP(Transmission Control Protocol)一种基于连接的可靠的稳定的无重复的传输协议。 1、TCP头部信息 TCP协议头部信息如下: 一共占用20个字节 16位源端口号:发送进程的主机端口16位目的端口号:接收主机…...
【android】设置背景图片
改变值,可显示zai在 在theves下面的两个value都要增加名字代码 <item name"windowActionBar">false</item><item name"android:windowNoTitle">true</item><item name"android:windowFullscreen">tru…...
Java微服务实战:使用Spring Boot构建高效服务
引言 在当今的软件开发实践中,微服务架构已成为推动快速开发和部署的关键因素之一。与传统的单体应用相比,微服务架构提供了更高的灵活性和可维护性。本文将探讨如何使用Java和Spring Boot来构建一个微服务应用,介绍基本概念,并通…...
【大模型】基于Hugging Face调用及微调大模型(1)
文章目录 一、前言二、Transformer三、Hugging Face3.1 Hugging Face Dataset3. 2 Hugging Face Tokenizer3.3 Hugging Face Transformer3.4 Hugging Face Accelerate 四、基于Hugging Face调用模型4.1 调用示例4.2 调用流程概述4.2.1 Tokenizer4.2.2 模型的加载4.2.3 模型基本…...
书生·浦语大模型全链路开源体系-笔记作业4
XTuner 微调 LLM:1.8B、多模态、Agent 引自:Tutorial/xtuner/personal_assistant_document.md at camp2 InternLM/Tutorial GitHub 1. XTuner介绍 引自:欢迎来到 XTuner 的中文文档 — XTuner 0.1.18.dev0 文档 1.1. 什么是 XTuner ? X…...
chrome调试手机网页
前期准备 1、 PC端安装好chrmoe浏览器 2、 安卓手机安装好chrmoe浏览器 3、 数据线 原文地址:https://lengmo714.top/343880cb.html 手机打开调试模式 进入手机设置,找到开发者模式,然后启用USB调试 打开PC端chrome调试功能 1、点击chr…...
Halcon 双相机标定与拼图(一)
一、概述 最近有一个多相机标定的项目,大概是4个相机来标定,同一坐标系,然后拼接图,之前双相机标定的时候也大概看看,所以今天就找了那个halcon 案例多学一下,后面我打算做一个对位贴合的东西,…...
计算机网络学习记录 应用层 Day6
你好,我是Qiuner. 为记录自己编程学习过程和帮助别人少走弯路而写博客 这是我的 github https://github.com/Qiuner ⭐️ gitee https://gitee.com/Qiuner 🌹 如果本篇文章帮到了你 不妨点个赞吧~ 我会很高兴的 😄 (^ ~ ^) 想看更多 那就点个关注吧 我…...
如何编辑pdf文件内容?3种PDF编辑方法分享
如何编辑pdf文件内容?在当今数字化时代,PDF文件因其跨平台兼容性和保持原样不变的特点,在办公、学习、生活等多个领域得到了广泛应用。然而,PDF文件的不可编辑性也让许多用户感到困扰。你是否曾经遇到过需要修改PDF文件内容&#…...
汇总!7种大模型的部署方法!
我们如何在本地部署运行私有的开源大型语言模型(LLMs)呢?本文将向您梳理七种实用的方法及如何选择。 Hugging Face的Transformers 这是一个强大的Python库,专为简化本地运行LLM而设计。其优势在于自动模型下载、提供丰富的代码片段…...
什么是函数?在C语言中如何定义一个函数
函数是编程中用于执行特定任务的一组指令的集合。它有一个名称(即函数名),可以通过该名称在程序中多次调用该函数以执行相同的任务。这有助于提高代码的可重用性和可维护性。 在C语言中,函数的定义通常包括以下几个部分ÿ…...
Stable Diffusion——四种模型 LoRA(包括LyCORIS)、Embeddings、Dreambooth、Hypernetwork
目前 Stable diffusion 中用到主要有四种模型,分别是 Textual Inversion (TI)以 Embeddings 为训练结果的模型、Hypernetwork 超网络模型、LoRA(包括 LoRA 的变体 LyCORIS)模型、Dreambooth 模型。 视频博主 koiboi 用…...
MySQL深分页,limit 100000,10 优化
文章目录 一、limit深分页为什么会变慢二、优化方案2.1 通过子查询优化(覆盖索引)回顾B树结构覆盖索引把条件转移到主键索引树 2.2 INNER JOIN 延迟关联2.3 标签记录法(要求id是有序的)2.4 使用between...and... 我们日常做分页需…...
Linux[高级管理]——使用源码包编译安装Apache网站
🏡作者主页:点击! 👨💻Linux高级管理专栏:点击! ⏰️创作时间:2024年5月31日14点20分 🀄️文章质量:96分 在Linux系统上编译和安装Apache HTTP Server是…...
Docker+JMeter+InfluxDB+Grafana 搭建性 能监控平台
JMeter原生报告的缺点: 无法实时共享 报告信息的展示不美观 需求方案 为了解决上述问题,可以通过 InfluxDB Grafana解决 : InfluxDB :是一个开源分布式指标数据库,使用 Go 语言编写,无需外部依赖 应用&am…...
NoSQL实战(MongoDB搭建主从复制)
什么是复制集? MongoDB复制是将数据同步到多个服务器的过程; 复制集提供了数据的冗余备份并提高了数据的可用性,通常可以保证数据的安全性; 复制集还允许您从硬件故障和服务中断中恢复数据。 保障数据的安全性 数据高可用性 (2…...
【讯为Linux驱动开发】3.内核空间和用户空间
【问】内存空间的组成部分?? 内存空间分为内核空间和用户空间 1.内核空间控制硬件资源,提供系统调用接口,保护系统自身安全稳定 2.用户空间实现业务逻辑 【问】如何进入内核空间使用硬件资源? 1.系统调用 2.软中断 3.…...
Debian系统简介
目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版ÿ…...
GitHub 趋势日报 (2025年06月08日)
📊 由 TrendForge 系统生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日获星趋势图 今日获星趋势图 884 cognee 566 dify 414 HumanSystemOptimization 414 omni-tools 321 note-gen …...
AI编程--插件对比分析:CodeRider、GitHub Copilot及其他
AI编程插件对比分析:CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展,AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者,分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...
全志A40i android7.1 调试信息打印串口由uart0改为uart3
一,概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本:2014.07; Kernel版本:Linux-3.10; 二,Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01),并让boo…...
JVM虚拟机:内存结构、垃圾回收、性能优化
1、JVM虚拟机的简介 Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以…...
宇树科技,改名了!
提到国内具身智能和机器人领域的代表企业,那宇树科技(Unitree)必须名列其榜。 最近,宇树科技的一项新变动消息在业界引发了不少关注和讨论,即: 宇树向其合作伙伴发布了一封公司名称变更函称,因…...
【HarmonyOS 5】鸿蒙中Stage模型与FA模型详解
一、前言 在HarmonyOS 5的应用开发模型中,featureAbility是旧版FA模型(Feature Ability)的用法,Stage模型已采用全新的应用架构,推荐使用组件化的上下文获取方式,而非依赖featureAbility。 FA大概是API7之…...
何谓AI编程【02】AI编程官网以优雅草星云智控为例建设实践-完善顶部-建立各项子页-调整排版-优雅草卓伊凡
何谓AI编程【02】AI编程官网以优雅草星云智控为例建设实践-完善顶部-建立各项子页-调整排版-优雅草卓伊凡 背景 我们以建设星云智控官网来做AI编程实践,很多人以为AI已经强大到不需要程序员了,其实不是,AI更加需要程序员,普通人…...
虚幻基础:角色旋转
能帮到你的话,就给个赞吧 😘 文章目录 移动组件使用控制器所需旋转:组件 使用 控制器旋转将旋转朝向运动:组件 使用 移动方向旋转 控制器旋转和移动旋转 缺点移动旋转:必须移动才能旋转,不移动不旋转控制器…...
安宝特方案丨从依赖经验到数据驱动:AR套件重构特种装备装配与质检全流程
在高压电气装备、军工装备、石油测井仪器装备、计算存储服务器和机柜、核磁医疗装备、大型发动机组等特种装备生产型企业,其产品具有“小批量、多品种、人工装配、价值高”的特点。 生产管理中存在传统SOP文件内容缺失、SOP更新不及、装配严重依赖个人经验、产品装…...
