当前位置: 首页 > news >正文

Block原理(二)- 用白话说说底层源码,不扯代码

之前有一篇关于block的源码探究分析 Block原理(一),时至今日,总觉的那篇文章说得不够流畅,今天打算从顶层设计的角度试着拆解下block的设计思想,拗脑的源码部分就不必再次触碰了,尽量保障这篇文章阅读下来不会感觉不舒服

block的顶层结构

摒弃图文,最主要的是能说得明白,而不是看得明白,一些关键名字我代替源码中的复杂命名,用别名代替,姑且往后看,后面会拆解为什么要这样指代别名

先从最全的结构说起,也就是 block捕获 __block 修饰的变量说起

注意层级关系,缩进的表示 属于上一层级

  • Block_Struct (我起的别名,为了指代方便)
    • Block_ByRef (用__block 修饰的变量就会产生这个结构)
      • forwarding (指向一块堆空间,后面会拆解)
      • var_ptr (捕获的变量,是个指针)
    • Block_Layout
      • isa (block类别,GlobalBlock/StackBlock/MallocBlock)
      • func_ptr (函数入口指针,就是上层代码中那个 {} 部分了)

Block_Struct这个结构 就是block的精髓了

  1. 首先会在栈上构建一个这样的结构

    构造 Block_ByRef

    Block_ByRef 捕获变量 var(__block修饰的变量), var_ptr 捕获的是 var的指针

    构造 Block_Layout

    isa 为 StackBlock(也就是栈block)

    func_ptr 指向 函数入口,也就是执行{}部分的入口函数地址

以上都是栈空间上的行为

一旦 上层代码中存在 block传参, 就会

  1. 堆上开辟空间 (注意: 开辟空间 发生在堆上)

    构造 Block_ByRef

    var_ptr = 栈Block_ByRef.var_ptr (栈上的值赋值过来)

    栈Block_ByRef 中的 forwarding 指向 这个 堆Block_ByRef 空间

    forwarding 也指向 自己这个 堆Block_ByRef 空间 (细细品一下)

    构造 Block_Layout

    isa = MallocBlock (也就是堆block)

    func_ptr = 栈Block_ByRef.func_ptr

上层代码中block的暗行为

上层语言中使用block,经常会传参,这个传参的过程 就是 Block_Struct 的拷贝过程

但不是单纯的Block_Struct指针拷贝,而是栈上额外创建一个 Block_Struct 结构

新创建的 Block_Struct 成员Block_Byref是块堆内存 (把栈上的 var_ptr 拷贝到这个堆内存上, forwarding 指向 这块堆内存)

成员 Block_Layout 也指向堆空间 (把栈上的 func_ptr 拷贝过来)

如此 导致什么样的效果

在上层高级语言中,表现出来就是

在block内部访问 block外定义的变量, 与在block外部访问 变量,能访问到同一个,

区别就是,外部是在栈上访问, 内部是在堆上访问

外部访问 - 栈A:Block_Struct -> 栈A:Block_Byref(栈) -> forwarding -> 堆空间 -> 变量var指针

内部访问 - 栈B:Block_Struct -> 栈B:Block_Byref(堆) -> forwarding -> 堆空间 -> 变量var指针

最终 访问到了同一块 堆内存, 无论内部还是外部,访问修改的都是同一块内存,所以就没什么问题了

block体执行

block定义之后,关键还是要执行的

在当前的栈Block_Layout里调用 func_ptr, 与 被拷贝到别处的 堆Block_Layout 里调用 func_ptr 效果也是一样的,不管在哪儿调用,func_ptr 入口函数地址 都是那一个

相关文章:

Block原理(二)- 用白话说说底层源码,不扯代码

之前有一篇关于block的源码探究分析 Block原理(一),时至今日,总觉的那篇文章说得不够流畅,今天打算从顶层设计的角度试着拆解下block的设计思想,拗脑的源码部分就不必再次触碰了,尽量保障这篇文…...

springboot整合knife4j接口文档成公共模块使用

theme: smartblue 之前项目中一直用的是swagger-ui进行接口文档的调用和使用,最近前端一直反馈页面不美观,调用凌乱,等一系列问题。基于这个问题我决定将其进行更改调整,上网搜索了一下发现knife4j是目前接口文档不错的一款插件。…...

软件测试需要学什么

软件测试近些年也是比较热门的行业,薪资高、入门门槛低,让很多开发人员想纷纷加入软件开发这个行业,想要成为这一岗位的一员,想要进入软件测试行业,他们需要学习什么呢? 软件测试需要学习的还挺多的&#…...

【蓝桥杯省赛真题17】python删除字符串 青少年组蓝桥杯python编程省赛真题解析

目录 python删除字符串 一、题目要求 1、编程实现 2、输入输出 二、解题思路...

C# LINQ 查询语句和方法的区别及使用

C# LINQ(Language-Integrated Query)是一种强类型、编译时的查询技术,它可以通过统一的语法对多种数据源进行查询和操作,包括对象、集合、数据库等。LINQ 提供了两种查询方式:查询语句和扩展方法。 查询语句&#xff…...

【nacos配置中心】源码部分解析

启动初始化 SpringApplication.prepareContext applyInitializers 回调ApplicationContextInitializer的initialize方法 getInitializers()从applicationContext获取List<ApplicationContextInitializer<?>> initializers 这个集合是通过SpringApplication的…...

Kotlin 1.6.0 的新特性

1、稳定版对于枚举、密封类与布尔值主语穷尽 when 语句 一个详尽的when语句包含了所有主题可能的类型或值的分支&#xff0c;或者对于一些类型包含一个else分支。它覆盖了所有可能的情况&#xff0c;使代码更加安全。 即将禁止非详尽的when语句&#xff0c;以使行为与when表达…...

nextjs13临时笔记

动态路由 文件夹以中括号命名[id] -pages: --list: ---[id]: ----index.jsx(访问路径/list/1 即这种形式/list/:id) ---index.jsx(访问路径/list)[...params]gpt接口分析 初始化项目 npm install next react react-dom # or yarn add next react react-dom # or pnpm add n…...

云计算与区块链之间有什么区别?

区块链是一种去中心化的分布式数字账本&#xff0c;可实现安全透明的交易和数据存储。 它使用节点网络来验证和验证交易。 云计算通过互联网提供计算资源&#xff0c;例如服务器、存储和软件。区块链是一种分散且不可变的虚拟数据分类账&#xff0c;用于维护交易信息和监控网络…...

sed命令常用例子

替换文件中的文本 将文件file.txt中的所有"old_text"替换成"new_text"&#xff1a; sed -i ‘s/old_text/new_text/g’ file.txt 删除文件中的某行 删除文件file.txt中的第5行&#xff1a; sed -i ‘5d’ file.txt 在文件中添加一行 在文件file.txt…...

MB510 3BSE002540R1在机器视觉工业领域最基本的应用

​ MB510 3BSE002540R1在机器视觉工业领域最基本的应用 大家都说人类感知外界信息的80%是通过眼睛获得的&#xff0c;图像包含的信息量是最巨大的。那么机器视觉技术的出现&#xff0c;就是为机器设备安上了感知外界的眼睛&#xff0c;使机器具有像人一样的视觉功能&#xff0c…...

nightingale-0-介绍单机二进制部署

(一) 夜莺介绍 Nightingale | 夜莺监控&#xff0c;一款先进的开源云原生监控分析系统&#xff0c;采用 All-In-One 的设计&#xff0c;集数据采集、可视化、监控告警、数据分析于一体&#xff0c;与云原生生态紧密集成&#xff0c;提供开箱即用的企业级监控分析和告警能力。于…...

一个从培训学校走出来的测试工程师自述....

简单介绍一下我自己&#xff0c;1997年的&#xff0c;毕业一年了&#xff0c;本科生&#xff0c;专业是机械制造及其自动化。 在校度过了四年&#xff0c;毕业&#xff0c;找工作&#xff0c;填三方协议&#xff0c;体检&#xff0c;入职。我觉得我可能就这么度过我平平无奇的…...

关于pyqt的一些用法

QT原生是C&#xff0c;pyqt基于python语言。 关于插件&#xff1a; 安装一个PyUIC&#xff0c;一个Qt Designer 点击Qt Designer可以出来ui配置页面&#xff0c;和qt原生IDE基本一样 上面操作会生成.ui文件&#xff0c;选中此文件&#xff0c;点击PyUIC&#xff0c;会生成对…...

【Paper Note】ViViT: A Video Vision Transformer

ViViT: A Video Vision Transformer AbstractOverview of vision transformer 回顾ViTEmbedding video clips 视频编码方式Uniform frame sampling 均匀采样Tubelet embedding 时空管采样初始化3D卷积代码介绍视频编码输入到模型当中 Transformer Models for VideoSpatio-tempo…...

Java入坑之IO操作

目录 一、IO流的概念 二、字节流 2.1InputStream的方法 2.2Outputstream的方法 2.3资源对象的关闭&#xff1a; 2.4transferTo()方法 2.5readAllBytes() 方法 2.6BufferedReader 和 InputStreamReader 2.7BufferedWriter 和 OutputStreamWriter 三、路径&#xff1a;…...

校园小助手【GUI/Swing+MySQL】(Java课设)

系统类型 Swing窗口类型Mysql数据库存储数据 使用范围 适合作为Java课设&#xff01;&#xff01;&#xff01; 部署环境 jdk1.8Mysql8.0Idea或eclipsejdbc 运行效果 本系统源码地址&#xff1a; 更多系统资源库地址&#xff1a;骚戴的博客_CSDN_更多系统资源 更多系统…...

String的不可变特性

1 问题 如何理解“String是不可变的&#xff0c;但是可以变”&#xff1f; 2 方法 &#xff08;1&#xff09;String的不可变特性体现在内容和长度 首先在idea中点开查看String这个类是如何定义的 可以看到这样一行代码&#xff1a;private final char value[]; 正是因为这个数…...

使用MMDeploy(预编译包)转换MMxx(MMDeploy支持库均可)pth权重到onnx,并使用python SDK进行部署验证

MMDeploy使用python部署实践记录 准备工作空间所需环境配置使用MMDeploy得到onnx使用MMDeploy加载onnx模型对单张图片进行推理使用python SDK对onnx模型进行验证 注意 mmdeploy C SDK的使用部署和实际操作过程请看本人另外一篇博文使用MMDeploy&#xff08;预编译包&#xff09…...

Shiro安全框架简介

一、权限管理 1.1 什么是权限管理 基本上只要涉及到用户参数的系统都要进行权限管理&#xff0c;使用权限管理实现了对用户访问系统的控制&#xff0c;不同的用户访问不同的资源。按照安全规则或者安全策略控制用户访问资源&#xff0c;而且只能访问被授权的资源 权限管理包括认…...

Android Wi-Fi 连接失败日志分析

1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分&#xff1a; 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析&#xff1a; CTR…...

手游刚开服就被攻击怎么办?如何防御DDoS?

开服初期是手游最脆弱的阶段&#xff0c;极易成为DDoS攻击的目标。一旦遭遇攻击&#xff0c;可能导致服务器瘫痪、玩家流失&#xff0c;甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案&#xff0c;帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...

【WiFi帧结构】

文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成&#xff1a;MAC头部frame bodyFCS&#xff0c;其中MAC是固定格式的&#xff0c;frame body是可变长度。 MAC头部有frame control&#xff0c;duration&#xff0c;address1&#xff0c;address2&#xff0c;addre…...

【大模型RAG】Docker 一键部署 Milvus 完整攻略

本文概要 Milvus 2.5 Stand-alone 版可通过 Docker 在几分钟内完成安装&#xff1b;只需暴露 19530&#xff08;gRPC&#xff09;与 9091&#xff08;HTTP/WebUI&#xff09;两个端口&#xff0c;即可让本地电脑通过 PyMilvus 或浏览器访问远程 Linux 服务器上的 Milvus。下面…...

srs linux

下载编译运行 git clone https:///ossrs/srs.git ./configure --h265on make 编译完成后即可启动SRS # 启动 ./objs/srs -c conf/srs.conf # 查看日志 tail -n 30 -f ./objs/srs.log 开放端口 默认RTMP接收推流端口是1935&#xff0c;SRS管理页面端口是8080&#xff0c;可…...

高危文件识别的常用算法:原理、应用与企业场景

高危文件识别的常用算法&#xff1a;原理、应用与企业场景 高危文件识别旨在检测可能导致安全威胁的文件&#xff0c;如包含恶意代码、敏感数据或欺诈内容的文档&#xff0c;在企业协同办公环境中&#xff08;如Teams、Google Workspace&#xff09;尤为重要。结合大模型技术&…...

C++.OpenGL (10/64)基础光照(Basic Lighting)

基础光照(Basic Lighting) 冯氏光照模型(Phong Lighting Model) #mermaid-svg-GLdskXwWINxNGHso {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GLdskXwWINxNGHso .error-icon{fill:#552222;}#mermaid-svg-GLd…...

关于 WASM:1. WASM 基础原理

一、WASM 简介 1.1 WebAssembly 是什么&#xff1f; WebAssembly&#xff08;WASM&#xff09; 是一种能在现代浏览器中高效运行的二进制指令格式&#xff0c;它不是传统的编程语言&#xff0c;而是一种 低级字节码格式&#xff0c;可由高级语言&#xff08;如 C、C、Rust&am…...

k8s业务程序联调工具-KtConnect

概述 原理 工具作用是建立了一个从本地到集群的单向VPN&#xff0c;根据VPN原理&#xff0c;打通两个内网必然需要借助一个公共中继节点&#xff0c;ktconnect工具巧妙的利用k8s原生的portforward能力&#xff0c;简化了建立连接的过程&#xff0c;apiserver间接起到了中继节…...

大学生职业发展与就业创业指导教学评价

这里是引用 作为软工2203/2204班的学生&#xff0c;我们非常感谢您在《大学生职业发展与就业创业指导》课程中的悉心教导。这门课程对我们即将面临实习和就业的工科学生来说至关重要&#xff0c;而您认真负责的教学态度&#xff0c;让课程的每一部分都充满了实用价值。 尤其让我…...