weak的底层原理

news2024/10/7 12:18:47

在这里插入图片描述

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 对象的强引用。
  • weakPerson1weakPerson2Person 对象的两个弱引用。
弱引用表表示
  1. 创建弱引用时
    • 假设 personInstance 的内存地址是 0x1000
    • weakPerson1 的内存地址是 0x2000
    • weakPerson2 的内存地址是 0x3000
Weak Table:
+-------------------+-------------------+
| Object Pointer    | Weak Reference(s) |
+-------------------+-------------------+
| 0x1000            | [0x2000, 0x3000]  |  // personInstance is referenced by weakPerson1 and weakPerson2
+-------------------+-------------------+

在这个弱引用表中:

  • 0x1000personInstance 的内存地址。
  • [0x2000, 0x3000] 是一个集合,包含了所有指向 personInstance 的弱引用指针(weakPerson1weakPerson2 的地址)。

对象释放时

personInstance 的引用计数变为零,系统准备释放该对象时,运行时会执行以下操作:

  1. 找到所有弱引用

    • 在弱引用表中查找键 0x1000,找到对应的值 [0x2000, 0x3000]
  2. nil

    • 0x20000x3000 地址上的值置为 nil
  3. 删除条目

    • 从弱引用表中删除键 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

  1. objc_initWeak:初始化一个弱引用,将其添加到弱引用表中。
  2. objc_loadWeak:读取一个弱引用的值,确保在对象被释放后返回 nil
  3. objc_storeWeak:给弱引用赋值,并更新弱引用表。
  4. objc_destroyWeak:销毁一个弱引用,并从弱引用表中移除对应的条目。

概述

弱引用表的键是被引用对象的内存地址,而值是一个集合,包含了所有指向该对象的弱引用指针的地址。当对象被释放时,运行时会在弱引用表中找到所有指向该对象的弱引用,并将它们置为 nil,然后删除对应的条目。通过这种机制,iOS 保证了 weak 引用的安全性和可靠性。

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

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

相关文章

酱菜产业:传承美味,点亮生活

酱菜,这道深受人们喜爱的传统美食,以其独特的风味和营养价值,点亮了我们的日常生活。酱菜产业作为美食文化的重要组成部分,正以其独特的魅力,吸引着越来越多的消费者。 酱菜产业的赵总说:酱菜的制作过程&am…

Nginx网站服务【☆☆☆】

市面上常用Linux的web服务器:apache、Nginx。 apache与nginx的区别? 最核心的区别在于NGINX采用异步非阻塞机制,多个连接可以对应一个进程;apache采用的是同步阻塞多进程/线程模型,一个连接对应一个进程。apache美国…

【C语言】一节课拿捏---动态内存分配

谢谢观看!希望以下内容帮助到了你,对你起到作用的话,可以一键三连加关注!你们的支持是我更新地动力。 因作者水平有限,有错误还请指出,多多包涵,谢谢! 目录 一、 为什么要有动态内存…

关于IDEA创建Maven一直爆红无法下载的问题

你能看到这我就知道你肯定已经试过了网上的很多方法了,我之前也是,试过了很多一直无法正常下载,我也是找人给 线下看了看解决了,我总结一下从头到尾排除问题,试到最后要是还解决不了你直接私信我,我给你看看…

vue3+uniapp

1.页面滚动 2.图片懒加载 3.安全区域 4.返回顶部,刷新页面 5.grid布局 place-self: center; 6.模糊效果 7.缩放 8.微信小程序联系客服 9.拨打电话 10.穿透 11.盒子宽度 12.一般文字以及盒子阴影 13.选中文字 14.顶部安全距离 15.onLoad周期函数在setup语法糖执行后…

微信小程序-案例:本地生活-首页(不使用网络数据请求)

一、 1.页面效果: 二、 1.新建项目并添加页面 在app.json文件中: "pages": ["pages/home/home","pages/message/message","pages/contact/contact"] 2.配置导航栏效果 在app.json文件中: &quo…

DVWA-XSS(DOM)

Low 后端没有代码,点击select按钮动作是前端的JS代码进行处理的 function addEventListeners() {var source_button document.getElementById ("source_button");if (source_button) {source_button.addEventListener("click", function() {v…

Doris Connector 结合 Flink CDC 实现 MySQL 分库分表

1. 概述 在实际业务系统中为了解决单表数据量大带来的各种问题,我们通常采用分库分表的方式对库表进行拆分,以达到提高系统的吞吐量。 但是这样给后面数据分析带来了麻烦,这个时候我们通常试将业务数据库的分库分表同步到数据仓库时&#x…

【杂谈】AIGC之ChatGPT-与智能对话机器人的奇妙对话之旅

与智能对话机器人的奇妙对话之旅 引言 在数字时代的浪潮中,ChatGPT如同一位智慧的旅伴,它不仅能够与我们畅谈古今,还能解答我们的疑惑,成为我们探索知识海洋的得力助手。今天,就让我们走进ChatGPT的世界,…

Capture One Pro 23:专业 Raw 图像处理的卓越之选

在当今的数字摄影时代,拥有一款强大的图像处理软件至关重要。而 Capture One Pro 23 for Mac/Win 无疑是其中的佼佼者,为摄影师和图像爱好者带来了前所未有的体验。 Capture One Pro 23 以其出色的 Raw 图像处理能力而闻名。它能够精准地解析和处理各种…

题号:BC19 题目:反向输出一个四位数

题号:BC19 题目:反向输出一个四位数 废话不多说,上题目: 解题思路: 我们发现可以用%和/两个操作符就可以解决。 代码如下: int main() {int a 0;scanf("%d ",& a);while (a){printf("%d "…

基于googlenet深度学习网络的睁眼闭眼识别算法matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 .................................................................. % 对测试集进行分类预…

如何通过 6 种简单方法将照片从华为转移到 PC?

华为作为全球领先的智能手机供应商之一,最近推出了其自主研发的操作系统——HarmonyOS 2.0,旨在为智能手机、平板电脑和智能手表等设备提供更流畅的用户体验。随着Mate 40/P40等系列手机计划升级到HarmonyOS 2.0,用户可能需要将手机中的文件备…

Aws EC2,kubeadm方式安装kubernetes(k8s)

版本 docker版本:20.10.25 k8s版本(kubeadm,kubelet和kubectl):1.20.10-0 初始化 # 禁用 SELinux sudo setenforce 0 sudo sed -i s/^SELINUXenforcing$/SELINUXpermissive/ /etc/selinux/config# 关闭防火墙 sudo …

计算机网络—路由器综合实验

一、实验内容 利用1个三层交换机和2个路由器完成以下实验: 1、路由器的基本配置 2、三层交换机的基本配置及路由配置 3、路由协议 (动态路由RIPv2) 二、实验环境与设备 (一)实验环境 Cisco Packet Tracer 8.2.1 &am…

1V1音视频实时互动直播系统

李超老师的项目 先肯定分为两个两个端,一个是服务器端一个是客户端。客户端用于UI界面的显示,服务器端用于处理客户端发来的消息。 我们先搭建stun和turn服务器 首先介绍一下什么是stun协议, 它是用来干什么的? stun协议存在…

有没有全面的人、货、场零售数据分析方案?

有。奥威BI零售数据分析方案正是这样一套全面的人、货、场零售数据分析解决方案,旨在帮助零售企业实现数据驱动的决策,优化业务流程,提升市场竞争力。 一、方案概述 该零售数据分析方案基于先进的BI技术,预设了以人、货、场、供…

Ubuntu安装cuda

文章目录 前言一、安装NVIDIA驱动1.1 过程中的问题1.2 解决方法1.3 重启后出现 perform MOK management 二、安装Cuda2.1 检查是否安装显卡驱动2.2 安装Cuda2.3 验证CUDA是否安装成功 三、配置环境变量---未完2.4 图片居中加调整大学 总结 #pic_center 前言 只是为方便学习&…

【设计模式深度剖析】【2】【行为型】【命令模式】| 以打开文件按钮、宏命令、图形移动与撤销为例加深理解

👈️上一篇:模板方法模式 设计模式-专栏👈️ 文章目录 命令模式定义英文原话直译如何理解呢? 四个角色1. Command(命令接口)2. ConcreteCommand(具体命令类)3. Client(客户端&…

Linux驱动开发笔记(六)中断子系统及实验

文章目录 前言一、中断子系统框架1. 中断硬件简单描述2. 中断的软件描述2.1 中断处理的两部分模型2.2 系统框架 二、GIC v3中断控制器1. GIC v3基本结构1.1 Distributor1.2 Redistributor1.3 ITS1.4 CPU interface 2. 中断类型与特点3. 中断号 三、函数编写3.1 相关API函数3.2 …