五个BLOCK问题

news2024/11/23 8:45:39

block的原理是怎样的?本质是什么?

一个含有自动变量的匿名函数

Block 的本质是一个封装了函数及其调用环境的 Objective-C 对象

一个 block 实际是一个对象,它主要由一个 isa 和 一个 impl 和 一个 descriptor 组成。

是封装了函数代码以及其执行上下文(捕获的变量和常量)的对象

一个 block 实例由 6 部分构成:

  1. isa 指针,所有对象都有该指针,用于实现对象相关的功能。
  2. flags,用于按 bit 位表示一些 block 的附加信息,本文后面介绍 block copy 的实现代码可以看到对该变量的使用。
  3. reserved,保留变量。
  4. invoke,函数指针,指向具体的 block 实现的函数调用地址。
  5. descriptor, 表示该 block 的附加描述信息,主要是 size 大小,以及 copy 和 dispose 函数的指针。
  6. variables,capture 过来的变量,block 能够访问它外部的局部变量,就是因为将这些变量(或变量的地址)复制到了结构体中。

__block的作用是什么?有什么使用注意点?

__block可以用于解决 block 内部无法修改auto变量值,__block不能也没必要修饰全局变量、静态变量

__block 是一个在 Block 内部修饰变量的关键字。使用 __block 修饰的变量可以在 Block 内部被修改,并且这些修改会在 Block 执行后在外部保留。在 Block 内部修改通过 __block 修饰的变量不会创建一个新的拷贝,而是直接修改原始变量。

  • 使用 __block 修饰的变量会增加其在栈上的生命周期,当 Block 在堆上被拷贝时,__block 修饰的变量也会被拷贝到堆上,确保 Block 内部对该变量的修改在 Block 外部也能得到保留。
  • 小心循环引用:如果一个对象持有一个拥有 __block 修饰的 Block 的强引用,而该 Block 又捕获了该对象,可能导致循环引用。此时需要在 Block 内部使用 __weak 来修饰对象,或者使用 weakSelfstrongSelf 来避免循环引用。
  • 在block执行的代码块中,将捕获的变量重置为 nil,缺点是必须执行完 block 块才会解决循环引用
  • 捕获变量作为参数传入

block的属性修饰词为什么是copy?使用block有哪些使用注意?

Block 在定义时通常存储在栈上,但如果你将 Block 赋值给一个引用类型(如将 Block 赋值给对象属性),为了避免在 Block 在栈上销毁后导致访问野指针的问题,需要将其拷贝到堆上。使用 copy 修饰符会在将 Block 赋值给引用类型时执行一次拷贝操作,确保 Block 在堆上得到正确的管理,以便在其生命周期内保持有效。

MRC 下 block 如果没有 copy 到堆上,值捕获不会对外部变量引用。 虽然 ARC 环境 strong 也可以修饰 Block,那是因为编译器会对 strong 修饰的 block 也会进行一次 copy 操作。为什么用 copy 修饰算是历史习惯问题,推荐不管 ARC、MRC 使用 copy 修饰 。使用注意:循环引用问题
block一旦没有进行copy操作,就不会在堆上
ARC 环境下下列操作会自动 block 进行 copy 操作:

  • block 作为方法的返回值
  • 将 block 赋值给 __strong 指针时
  • block 作为Cocoa API中方法名含有usingBlock的方法参数时
  • block 作为GCD API的方法参数时
  • block捕获变量使用的时候

block在修改NSMutableArray,需不需要添加__block?

在 Block 内部修改 NSMutableArray(或其他可变集合类)的内容时,并不需要添加 __block 修饰符。可变集合类是引用类型,所以 Block 内部对它的修改会直接影响到原始对象,无需使用 __block 修饰符。

ARC 对 block 类型的影响

在 ARC 开启的情况下,将只会有 NSConcreteGlobalBlock 和 NSConcreteMallocBlock 类型的 block。

原本的 NSConcreteStackBlock 的 block 会被 NSConcreteMallocBlock 类型的 block 替代。证明方式是以下代码在 XCode 中,会输出 <__NSMallocBlock__: 0x100109960>。在苹果的 官方文档 中也提到,当把栈中的 block 返回时,不需要调用 copy 方法了。

Pasted image 20230727164219.png

我个人认为这么做的原因是,由于 ARC 已经能很好地处理对象的生命周期的管理,这样所有对象都放到堆上管理,对于编译器实现来说,会比较方便。

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

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

相关文章

华为OD面试总结和建议:全程线上面试的经验分享

目录 导语一、准备工作&#xff1a;二、面试前&#xff1a;三、面试过程&#xff1a;1. 视频面试技巧&#xff1a;2. 技术问题准备&#xff1a; 四、面试后&#xff1a;结束语 导语 导语&#xff1a;随着技术的发展&#xff0c;线上面试在招聘过程中扮演着越来越重要的角色。作…

11万多英藏对照词典英藏翻译ACCESS\EXCEL数据库

今天继续发一个藏文藏语相关的翻译数据库&#xff0c;即英藏对照词典&#xff0c;加上《5万6千多藏文词典解释ACCESS数据库》以及昨天发的《近13万汉藏对照词典汉藏翻译ACCESS\EXCEL数据库》藏文类的数据就算较全了。 截图下方有显示“共有记录数”&#xff0c;截图包含了表的所…

js方法:toLocaleString()

js中的toLocaleString()方法用于将数字转换为本地化的字符串表示形式。 语法&#xff1a; number.toLocaleString([locales [, options]]) locales&#xff08;可选&#xff09;&#xff1a;一个字符串、字符串数组&#xff0c;表示要使用的语言或一组语言。例如&#xff0c;&…

拍立淘是如何实现的?

淘宝拍立淘功能是很多网购的网民经常会用到的一个功能。拍立淘的图片搜索商品列表接口功能是指用户可以通过上传一张商品图片&#xff0c;拍立淘会根据该图片进行识别和匹配&#xff0c;以找到与该图片相似或相同的商品&#xff0c;并将搜索到的商品列表返回给用户。以下是该接…

《深度探索c++对象模型》第五章笔记

非原创&#xff0c;在学习 5 构造、解构、拷贝语意学Semantics of Construction,Destruction, and Copy 考虑下面这个abstract base class声明: class Abstract_base { public:virtual ~Abstract_base() 0;virtual void interface() const 0;virtual const char*mumble() c…

Robot Framweork之UI自动化测试---分层设计

Robot Framework 的分层思想是一种测试设计和代码组织的模式&#xff0c;它将测试用例的实现和测试执行逻辑分离&#xff0c;以提高测试的可维护性、可读性和可扩展性。 一、分层思想 在实际项目中&#xff0c;一般分为三层&#xff1a;元素层&#xff0c;流程层&#xff0c;用…

异步消息传递技术 JMS AMQP MQTT

广泛使用的三种异步消息传递技术&#xff1a;JMS AMQP MQTT JMS AMQP MQTT JMS&#xff08;Java Message Service)&#xff1a;一个类似JDBC的规范&#xff0c;提供了与消息服务相关的API接口 JMS消息模型&#xff1a; P2P 点对点模型&#xff1a;消息发到一个队…

BES 平台 SDK之按键的配置

本文章是基于BES2700 芯片&#xff0c;其他BESxxx 芯片可做参考&#xff0c;如有不当之处&#xff0c;欢迎评论区留言指出。仅供参考学习用&#xff01; BES 平台 SDK之LED的配置_谢文浩的博客-CSDN博客 关于系统LED简介可参考上一篇文章。链接如上所示&#xff01; 一&…

【ONE·Linux || 基础IO(一)】

总言 文件输入与输出相关介绍&#xff1a;语言层面/系统层面文件调用接口举例、文件描述符、重定向说明、缓冲区理解。 文章目录 总言1、文件输入与输出1.1、预备知识1.2、语言层面&#xff1a;回归C语言中文件相关接口1.2.1、打开文件和关闭文件&#xff1a;对当前路径的理解…

企业服务器中了Locked勒索病毒后怎么办,如何解决问题并提高防范意识

科学技术的发展给我们的生活带来了极大便利&#xff0c;但也为企业带来了安全威胁。近期&#xff0c;我们收到很多企业的求助&#xff0c;企业的服务器中了locked后缀勒索病毒&#xff0c;计算机上的所有文件都被加密&#xff0c;无法被正常调取&#xff0c;严重影响了企业的正…

使用预训练 ViT 模型的图像字幕中的视觉变换器 (ViT)-附源码

介绍 使用预训练 ViT 模型的图像字幕可以被视为图像下方的文本或书面描述,旨在提供图像细节的描述。它将图像翻译成文本描述的任务。它是通过连接视觉(图像)和语言(文本)来完成的。在本文中,我们使用图像中的 Vision Transformers (ViT) 作为使用 PyTorch 后端的主要技术…

2023牛客暑假多校-5-I-The Yakumo Family

解法&#xff1a;考虑枚举这个区间&#xff0c;设这个区间异或和为w。对于左端点 &#xff0c;预处理出其左侧的所有子区间异或和的和 ,表示区间上所有子区间异或和。对右侧也做同样操作预处理出&#xff0c;表示区间上所有子区间异或和。那么最后答案就是。最重要的就是如何求…

Linux下 Docker容器引擎基础(2)

目录 创建私有仓库 将修改过的nginx镜像做标记封装&#xff0c;准备上传到私有仓库 将镜像上传到私有仓库 从私有仓库中下载镜像到本地 CPU使用率 CPU共享比例 CPU周期限制 CPU 配额控制参数的混合案例 内存限制 Block IO 的限制 限制bps 和iops 创建私有仓库 仓库&a…

【数据结构|二叉树遍历】递归与非递归实现前序遍历、中序遍历、后序遍历

递归与非递归实现二叉树的前序遍历、中序遍历、后序遍历。 二叉树图 定义 前序遍历&#xff08;Preorder Traversal&#xff09;&#xff1a; 前序遍历的顺序是先访问根节点&#xff0c;然后按照先左后右的顺序访问子节点。对于上面的二叉树&#xff0c;前序遍历的结果是&…

IO流中「线程」模型总结

一、基础简介 在IO流的网络模型中&#xff0c;以常见的「客户端-服务端」交互场景为例&#xff1b; 客户端与服务端进行通信「交互」&#xff0c;可能是同步或者异步&#xff0c;服务端进行「流」处理时&#xff0c;可能是阻塞或者非阻塞模式&#xff0c;当然也有自定义的业务…

12.其他事件

12.1 页面加载事件 加载外部资源&#xff08;如图片、外联CSS和JavaScript等&#xff09;加载完毕时触发的事件 1.事件名&#xff1a;load ●监听页面所有资源加载完毕&#xff1a; ➢给window添加load事件 //页面加载事件 window.addEventListener( load, function () { //…

java后端富文本转word,再传递到浏览器下载。

思路参考&#xff0c;以及所有的工具类都使用了》牧羊人大佬的代码《 有帮助的话不用给到我点赞&#xff0c;给大佬点赞即可 这是前端代码&#xff0c;必须使用get。 post后端返回的流浏览器接收不到&#xff08;具体原因不详&#xff09;。get无法传递requestBody&#xff0c;…

Python实现GA遗传算法优化BP神经网络分类模型(BP神经网络分类算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 遗传算法&#xff08;Genetic Algorithm&#xff0c;GA&#xff09;最早是由美国的 John holland于20世…

STM32F4_内存管理(Malloc、Free)

目录 前言 1. 内存管理介绍 1.1 分块式内存管理 2. 实验程序 2.1 main.c 2.2 Malloc.c 2.3 Malloc.h 前言 相信大家在学习C语言的过程中&#xff0c;都会学习到 malloc 动态开辟函数和 free 释放内存函数&#xff1b;这两个函数带给我们的优越性是&#xff1a; 我们在使…

[深度学习] GPU处理能力(TFLOPS/TOPS)

计算能力换算 理论峰值 &#xff1d; GPU芯片数量GPU Boost主频核心数量*单个时钟周期内能处理的浮点计算次数 只不过在GPU里单精度和双精度的浮点计算能力需要分开计算&#xff0c;以最新的Tesla P100为例&#xff1a; 双精度理论峰值 &#xff1d; FP64 Cores &#xff0a;…