Block底层原理读书笔记-《高级编程- iOS与OS多线程和内存管理》(更新中)

news2024/11/18 11:28:48

1 一个Block 真正的底层都有些什么?

Block会被解析成一个结构体(这里成为Block结构体),这个结构体里有:

(1)isa指针(说明Block的本质是一个对象):指向Stack、堆

(2)有函数指针(这个函数指针指向一个函数体,该函数体的内容就是Block函数体的内容)。该函数的【参数表】里面有一个参数为【这个Block结构体类型】的参数,在调用这个Block 函数的时候,会把该函数所属Block结构体作为参数值传入。函数可通过这个Block参数读取里面的捕获变量。这就是实现捕获外部变量的手段。

(3)如果Block有使用到外部变量,该结构体还会有捕获的变量(以结构体成员变量的形式存在,使用到的外部变量有多少个,就有多少个成员变量)捕获变量在结构体里面的声明没有改变。(就是跟Block捕获到的时候的声明一模一样)

2 Block捕获变量

【Block捕获自动变量(正常的Block,没有__block介入)】:Block使用到的变量会被存储(值拷贝)到Block结构体实例(的成员变量/属性)中。这个捕获发生在Block创建的时候(即:将捕获到的值传递给【Block结构体】的构造函数进行保存)。

 

2.1 在Block内改变捕获变量的值

在Block内可以改变【Block外部变量的值】的方式:

(1)C语言的:静态(局部)变量、静态全局变量、全局变量(P103-P104)

(2)使用__block说明符

 【Block不捕获全局变量】:Block 只会捕获局部变量,对于全局变量、全局静态变量,是不会捕获的。这些全局变量的作用域是全局的,在Block中也能生效。

【Block捕获局部静态变量】:捕获的是该变量的指针(该变量地址)

【Block捕获__block修饰的变量】:__block 的变量会变成一个__block结构体(含有isa指针)P105,该结构体内部保存了捕获的变量值(__block结构体成员变量)。Block捕获的是该结构体指针。

2.2 OC中的存储域类说明符(__block)

所谓存储域类说明符,就是指定将变量值存放到哪个存储区域中(堆、栈、寄存器)

C语言中,存储域类说明符有:

extern:声明所修饰的内容(变量/函数)能否为外部文件访问——变量/函数作用域

static:(修饰变量的时候)表示作为静态变量存储在静态变量区;修饰函数的时候,表示该函数只能在当前文件内访问,外文文件不可访问——函数作用域

auto:表示作为自动变量存储在栈中

register:表示尽可能将变量存储到CPU寄存器中

2.3 对捕获变量使用__block带来的改变

(1)【使用__block前】:捕获的变量是通过【值传递】赋值给Block结构体内的属性A(通过构造函数)进行保存,在Block函数体内又通过【值传递】(读取Block结构体的A属性)赋值给捕获的变量,这都是只读的,因此,我们在Block函数内不能修改捕获变量的值,否则在编译的时候就会报错。

 

(2)【使用__block后】:被捕获的变量不再是简单的值传递。而是在此之前,生成一个专属的【捕获变量结构体】,在该结构体中,持有与原捕获变量一摸一样的结构体成员。前面所说的在底层上对捕获变量的所有操作,都是在操作这个新创建的【捕获变量结构体】内保存的结构体成员。如此一来,通过修改【捕获变量结构体】中的结构体成员,就可以达到在Block内修改捕获变量的目的。 

 

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

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

相关文章

动态修改Azure DevOps区域路径或迭代路径的继承权限(Inhertiance)

Contents1. 场景描述2. 解决方案2.1 更改继承的接口:ChangeInhertiance2.2 获取区域路径的接口:ClassificationNodes1. 场景描述客户使用工作项模板,定制了一个设计变更流程,需要在不同的阶段(流程状态)控制工作项的更改权限。我们…

Grafana 系列文章(六):Grafana Explore 中的日志

👉️URL: https://grafana.com/docs/grafana/latest/explore/logs-integration/#labels-and-detected-fields 📝Description: Explore 中的日志 除了指标之外,Explore 还允许你在以下数据源中调查你的日志。 ElasticsearchInfluxDBLoki 在基…

[算法设计与分析考点4] 改进的串匹配算法——KMP算法

算法核心思想 在BF算法的基础上加以改进,BF算法中每次当前字符不相等时,主串S要回溯到其下一个字符处,模式串T要回溯到 j0 位置进行下一趟的匹配。然而,大多数情况下,这种回溯是没有必要的,非常耗时且效率低…

qt入门介绍

1.Qt 是一个跨平台的 C开发库。主要用来开发图形用户界面(GUI)程序。Qt 虽然经常被当做一个 GUI 库,用来开发图形界面应用程序,但这并不是 Qt 的全部;Qt 除了可以绘制漂亮的界面(包括控件、布局、交互&…

【css】前端拉下代码后,node-sass sass-loader 与node版本不符怎么办

因为每次node和sass版本匹配都容易出现问题, 所以如果我自己开发,我不使用sass或者less,只用原生css 但如果是拉下来的项目,别人已经成功使用,webview版本 和 sass已经匹配,只需考虑 node版本匹配。 根据…

Hive分析函数系列文章

Hive分析窗口函数(一) SUM,AVG,MIN,MAXhttps://blog.csdn.net/weishuai90/article/details/128843715 Hive分析窗口函数(二) NTILE,ROW_NUMBER,RANK,DENSE_RANKhttps://blog.csdn.net/weishuai90/article/details/128858824 Hive分析窗口函数(三) CUME_DIST,PERCENT_RANKhttp…

Object类有什么作用?怎样使用Object类?

在Java中提供了一个Object类,它是所有类的父类,即每个类都直接或间接继承自该类,因此,Object类通常被称之为超类、基类或根类。当定义一个类时,如果没有使用extends关键字为这个类显示地指定父类,那么该类会…

【微积分易错点总结】函数、极限和连续

🚀write in front🚀 📜所属专栏: 🛰️博客主页:睿睿的博客主页 🛰️代码仓库:🎉VS2022_C语言仓库 🎡您的点赞、关注、收藏、评论,是对我最大的激励…

DSPE-PEG-DOTA,磷脂聚乙二醇大环配体 二硬脂酰基磷脂酰乙醇胺- 聚乙二醇-四氮杂环配体

中文名称:二硬脂酰基磷脂酰乙醇胺- 聚乙二醇-四氮杂环配体 英文名称:DSPE-PEG-DOTA 别称:1,2-distearoyl-sn-glycero-3-phosphoethanolamine-poly(ethylene glycol)-DOTA PEG分子量:1000、2000、3400、5000等等 用 途&#xf…

《流浪地球2》的现实倒影(一):从量子计算机到MOSS

编者按:跟大家一样,《流浪地球2》的上映让我们感到无比兴奋。作为科技领域的内容创作者,在《流浪地球2》中不仅看到了中国科幻电影与电影工业的崛起,更看到了大量现实中真实存在的科技脉络。由于这部电影在科技方面的基本功非常扎…

RK3568平台开发系列讲解(驱动基础篇)自旋锁详解

🚀返回专栏总目录 文章目录 一、什么是spinlock 自旋锁二、什么是raw_spinlock原始自旋锁三、自旋锁的使用3.1、spinlock 自旋锁相关API3.2、raw_spinlock原始自旋锁相关API沉淀、分享、成长,让自己和他人都能有所收获!😄 📢自旋锁用于处理器之间的互斥,适合保护很短的…

Python枚举类定义和使用

一些具有特殊含义的类,其实例化对象的个数往往是固定的,比如用一个类表示月份,则该类的实例对象最多有 12 个;再比如用一个类表示季节,则该类的实例化对象最多有 4 个。针对这种特殊的类,Python 3.4 中新增…

@WebServlet注解的解释和使用

大家好,今天分享一下WebServlet注解 首先,我们要知道,我们要写一个servlet程序,web,xml里的配置项很重要,里面包含了很多关于类绑定,以及服务器资源的请求路径问题(就是注册) 先把我这个看一遍&#xff0c…

【蓝桥杯】历届真题 完全二叉树的权值(省赛)Java

【资源限制】 内存限制:256.0MB C/C时间限制:1.0s Java时间限制:3.0s Python时间限制:5.0s 【问题描述】 给定一棵包含N个节点的完全二叉树,树上每个节点都有一个权值,按从上到下、从左到右的顺序依…

SpringBoot将项目打包成JAR包或者WAR包

SpringBoot将项目打包成JAR包或者WAR包前言打包成JAR包打包成WAR包打包遇到的问题Maven环境问题跳过测试并打包前言 本文开发工具使用IDEA,已配置好Maven环境,如果未配置的可以参考另外一篇文章: Maven如何配置阿里镜像及安装全步骤 打包成JAR包 默认…

【C++】继承——切片、隐藏、默认成员函数、菱形

文章目录一、继承概念及定义二、赋值转换——切片三、继承的作用域——隐藏四、派生类的默认成员函数五、继承与友元六、继承与静态成员七、菱形继承及菱形虚拟继承八、继承与组合九、结语一、继承概念及定义 概念 继承(inheritance)机制是面向对象程序设计使代码可以复用的最…

刚毕业小白软考中级什么专业合适?

如果只是想考取软考中级证书,可以考虑比较热门的考试项目,当然具体还是要看和自己的职业发展和需求是否匹配为前提,这样对于自己今后的职业生涯规划也有一定帮助。中级科目介绍:软考中级备考攻略:反正只要认真备考&…

使用PyTorch构建卷积GAN源码(详细步骤讲解+注释版) 02人脸图片生成 上

阅读提示:本篇文章的代码为在普通GAN代码上实现人脸图片生成的修改,文章内容仅包含修改内容,全部代码讲解需结合下面的文章阅读。 相关资料链接为:使用PyTorch构建GAN生成对抗 本次训练代码使用了本地GPU计算。 1 CelebADataset类…

2023.1.23-1.29 AI行业周刊(第134期):春节回家乡的感受

春节的假期,时间过得很快。 年前回家在路上的时候,就考虑到过年时间短暂,但是当大年初六和家乡别离,和大姐二姐们再见的时候,心中还是充满了不舍。 2022年初回家过年的画面还印在脑海中,和家乡相聚的频率…

【自然语言处理】文本分析:非结构化信息分析科学与应用导论(主题建模)

文本分析:非结构化信息分析科学与应用导论(主题建模)1.介绍 文本聚类可以将数据(这里即指文本)按照一定规则划分为不同的群组,理想情况下可以从聚类结果中发现一些有趣的模式。不同聚类方法的一致性意义和…