08.02-block变量捕获

iOS开发——block底层实现与变量捕获 前言 首发地址:block底层实现与变量捕获 带着问题阅读 block的本质是什么?你能讲出来它的底层结构吗? 全局变量会被block捕获吗?block会捕获哪些变量? block的底层数据结构 block又叫代码块,是OC语法中非常重要的一个概念,我们先来看一下Block的简单使用。 int main(int argc, const char * argv[]) { @autoreleasepool { ^{ NSLog(@"hello block"); 阅读详情

1. 变量捕获

1.自动变量

  • 值传递, 把值复制过来
    外部变量改变了,block里面的变量值不会改变,说明是两个变量,并不是同一个
//变量
        int autovari = 10;
        void (^auto_block)(void) = ^{
            NSLog(@"auto_block---%d",autovari); // auto_block---10
        };
        autovari = 11; //autovari---11
        NSLog(@"autovari---%d",autovari);
        auto_block();

2. static变量

  • 指针传递 捕获的是静态变量的地址
    外部把变量的值改变了,block里面的值也会改变
    block里面的静态变量指针指向的是静态变量
		static int staticvari = 20;
        void (^static_block)(void) = ^{
            NSLog(@"static_block---%d",staticvari);
            //static_block---21
        };
        staticvari = 21;//staticvari---21
        NSLog(@"staticvari---%d",staticvari);
        static_block();
3. 全局变量

  • 不会捕获变量
    使用的时候直接使用全局变量

2. 总结

  • 为什么要捕获变量?
  • 局部变量会捕获,全局不变不会被捕获
    局部变量随时可能消失,block要使用的时候就有可能找不到这个局部变量,所以要捕获到block的内部,这样使用的时候就不需要管外部的局部变量是不是还存在,只要使用内部的捕获变量就行
  • 变量时对象也是一样的(对象类型的局部变量连所有权修饰符一起捕获)(__strong,__weak都会捕获)
block-变量的捕获(capture) 为了能够保证block正常访问外部的变量,block有个变量捕获机制,如下图 auto:自动变量,平时我们定义int age = 10,前面有个auto,auto int age = 10,系统帮我们默认的加上了一个auto。—–值传递—– static:静态变量 —–指针传递—– 全局变量 —–直接访问—– 根据上面结论,我们一个个展开讨论和分析。 一、自动变量auto修饰... 阅读详情

相关推荐

iOS面试题:block 为什么能够捕获外界变量? __block做了什么事?

研究Block的捕获外部变量就要除去函数参数这一项,下面一一根据这4种变量类型的捕获情况进行分析。 自动变量 静态变量 静态全局变量 全局变量 首先 全局变量global_i和 静态全局变量static_global_j 的值增加,以及它们被Block捕获进去,这一点很好理解,因为是全局的,作用域很广,所以Block捕获了它们进去之后,在Block里面进行++操作,Block结束之后,它们的...

D_猿员的博客 929

一篇就带你读懂关于block的变量捕获(capture)

上面一节讲解了block的本质,举例了block最简单结构的一种情况。如果更复杂了呢。比如block函数执行调用外部参数,会有哪些情况呢?不同的情况,他们又有什么异同点呢?这里先把分析结果写在最前面,不懂的可以先跳过,看下面的正文每一个情形有底层结构分析。如果能看明白的,可以不看下面的正文,说明你已经很清楚 block 变量捕获机制了: 1、block变量捕获机制(capture) 1、捕获(capture):是指在 block 内部会专门新增一个成员变量,来存储传进来的值。或者说将外面的值捕获到 bl

chenzimin_blog 2472

iOS之深入解析Block的使用和外部变量捕获

一、前言 闭包 = 一个函数「或指向函数的指针」+ 该函数执行的外部的上下文变量「也就是自由变量」; Block是Objective-C对于闭包的实现。 其中,Block: 可以嵌套定义,定义Block方法和定义函数方法相似; Block 可以定义在方法内部或外部; 只有调用Block时候,才会执行其{}体内的代码; 本质是对象,使代码高聚合。 使用 clang 将 OC 代码转换为 C++ 文件查看block的方法: 在命令行输入代码 clang -rewrite-objc 需要编译的OC文件

╰つ栺尖篴夢ゞ 3万+

OC对象 - Block的变量捕获

oubijiexi。

sharp521的博客 818

Win64 驱动内核编程-16.WFP网络监控驱动(防火墙)

WFP驱动监控网络 WFP是微软推出来替代TDIHOOK、NDISHOOK等拦截网络通信的方案,WFP的框架非常庞大,在RING3和RING0各有一套类似的函数,令人兴奋的是,即使在R3使用WFP,也可以做到全局拦截访问网络。由于WFP的范围太广,实在难以一言概括,感...

墨鱼菜鸡 1033

AI智能体Codex实战:外贸客户开发自动化,85家精准客户深度分析

如果你在外贸行业,特别是工业品领域,一定遇到过这样的困境:想开发海外客户,但不知道从何下手。Google搜索出来的要么是B2B平台上的老面孔,要么是信息残缺的过时黄页。手动筛选、整理、验证,一个客户信息就要花上半小时,效率低得让人抓狂。 更头疼的是,好不容易找到一些公司名称,却不知道他们的采购决策人是谁、公司规模如何、业务是否匹配。传统的客户开发就像大海捞针,投入大量时间成本,回报却充满不确定性。 今天要介绍的这个工具,可能会彻底改变你的工作流。它不是另一个CRM软件,而是一个基于AI的智能客户开发与情报分

weixin_29054399的博客 346

Block背后的数据结构及变量截取

本文的内容主要是基于Clang编译器的官方文档所写。 Clang 先说些题外话,什么是Clang?Clang是C++编写的编译器。我们知道,我们平常代码所写的任何程序,最终都需要通过编译器转换成与语言无关的机器二进制代码。而Clang,则是支持/C++/Objective-C/Objective-C++的编译器。那我们在做OC开发时,可能也会听说LLVM编译器,那么Clang和LLVM之间是什么关...

无忘无往 1806

6.4 构网型储能的需求与配置

摘要: 构网型储能是新型电力系统的关键支撑技术,通过提供电压/频率形成、惯性和稳定控制能力,解决同步机退出导致的系统稳定性问题。其配置需遵循三大原则:1)容量配置以支撑需求为主导,兼顾能量服务;2)优先布局于电网薄弱点、稳定问题突出区域;3)采用自适应控制策略实现全工况优化。核心应用场景包括新能源送出通道稳定、负荷中心调频、黑启动电源等。规划方法需结合系统分析、量化指标和成本效益评估,实现技术经济最优。未来需重点关注构网/跟网混合系统的临界容量占比及自适应控制技术发展。

技术工作者 1140

【iOS】——Block底层实现和捕获机制

Block的本质是一个对象,其内部的第一个成员是isa指针,通过内部的FuncPtr指针指向实际执行的函数,也就是Block中花括号里面的代码内容。Block只会捕获自己需要使用的自动变量并将其保存进了Block的结构体实例中,也就是Block自身中。Block捕获普通的局部变量只是通过构造函数将它的值传递进了Block的结构体实例中的成员,因此不能在Block内部修改值,并且在Block外修改的值也不会影响Block捕获时的值。

m0_73974920的博客 1462

MATLAB 论文复现——面向紧急需求响应的规模化灵活资源负荷管理快速决策方法

其次,对灵活资源参与EDR的功率分配模型进行了建模,并提出了基于分层分布式共识算法的快速决策方法,对功率分配模型进行快速求解,以满足EDR实时性的需求,在保证较高精度的前提下提高了决策速度。[1]孔祥玉,杨至端,孙裕策,等.面向紧急需求响应的规模化灵活资源负荷管理快速决策方法[J/OL].电力系统自动化,1-13[2024-07-29].http://kns.cnki.net/kcms/detail/32.1180.TP.20240709.1843.002.html.关键词: 规模化灵活资源;

sjr1478的博客 374

【电驱动】永磁同步电机工作原理及分类

永磁同步电机工作原理及分类

星Yeah 的博客 7325

block变量捕获机制

本文打算分 基本类型和 对象类型 进行论述 学习内容: 基本数据类型 例如: 1、 捕获变量 2、 __block 修改变量 3、 block变量结构体 3、 底层逻辑 4、 __forwarding指针 5、 尝试使用 __forwarding指针 对象类型: 1、 捕获变量 2、 __block 修改变量 3、 block变量结构体 3、 底层逻辑 4、 __forwarding指针 5、强弱引用 6、内存管理 7、循环引用 基本数据类型 捕获变量 int a = 1; static int b

iOS随笔 1058

PLSQL Developer14连接Oracle详细过程

下载地址:Instant Client for Microsoft Windows (x64) 64-bit | Oracle 中国解压客户端工具到一个目录(解压文件到当前目录,自动合并成一个目录)​ 电脑(右键)→属性→高级系统设置→环境变量→系统环境变量→新建变量名:NLS_LANG 变量值: AMERICAN_AMERICA.ZHS16GBK​ 变量名:TNS_ADMIN 变量值:C:\xiaxinyu\software\Oracle\instantclient_19_10​ 在Oracle客户端(C

summer_fish的专栏 3983

Block原理,为什么block能捕获变量 -- 原理篇

主要参考了这些文章 , 有删改: http://www.jianshu.com/p/ee9756f3d5f6 https://www.jianshu.com/p/c99f4974ddb5 https://www.jianshu.com/p/8865ff43f30e 前言 Blocks是C语言的扩充功能,而Apple 在OS X S...

gcs的博客 1万+

SI好文翻译:铜箔表面纹理对损耗的影响:一个有效的模型(一)

Paul G. Huray发表在DesignCon2010的提出铜箔表面雪球模型的论文。第一部分说明之前的铜箔表面模型只适用于5GHz以内,超过5GHz后就不再准确。

小孟同学的博客 2172

麒麟V10安装图形化界面

在配置VNC时发现,原本麒麟V10系统最小化安装,导致无图形化界面,先需要对其进行安装。 首先确保无图形化界面,可以在终端输入startX命令查看是否报错。 安装介绍: 1、 安装图形化界面 yum grouplist //查看可用yum安装组 注:这里一般会有缺少包或者出现包不符合的问题 导入软件包分组信息文件xxxx-comps.xml arm: 将此文件传送到源服务器, 然后createrepo -g导入到arm的base目录和updates目录 createrepo -g e33dc

Pro_jhf的博客 8071

【block编程第二篇】 block捕获变量和对象

----------------------------------------欢迎查看block连载博客:【专栏】---------------------------------------【block编程第一篇】block语法                【block编程第二篇】block捕获变量和对象(当前)【block编程第三篇】block的内存管理。  【block编程第四篇】blo...

郭晓东的专栏 5794

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Block的变量捕获

文章目录变量分类变量捕获后的block 变量分类 在了解变量捕获之前,我们首先了解一下C语言中变量的分类。C语言中变量分为三类 全局变量: 作用域在全局,哪个地方都能调用 局部变量:作用域在大括号中,只能在大括号内调用 block变量捕获分类 // 全局变量 int = 10; int main(int argc, const char * argv[]) { @autoreleasepool { // 自动变量 auto int b = 20;

Meet的博客 356

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

深入研究Block捕获外部变量和__block实现原理

前言 Blocks是C语言的扩充功能,而Apple 在OS X Snow Leopard 和 iOS 4中引入了这个新功能“Blocks”。从那开始,Block就出现在iOS和Mac系统各个API中,并被大家广泛使用。一句话来形容Blocks,带有自动变量(局部变量)的匿名函数。 Block在OC中的实现如下: struct Block_layout { void *isa;

ZH952016281的博客 2398

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Block 捕获变量的实现原理之基本数据类型变量

之前的文章我们谈过关于C语言结构体的一些知识,借助于这些知识我们来看一下OC中关于Block的内部实现原理. 1. Block基本知识 1.1 Block的内部实现 在apple开源的objc源代码中,我们找到了关于Block实现的一些细节: // Values for Block_layout->flags to describe block objects enum { ...

王二东的博客 331

探究Block原理(下篇)-捕获变量分析及__block原理

主要内容: 1.分析Block捕获外部变量的过程 2.理解Block修改外部变量的限制 3.分析__block存储域类说明符的原理 4.理解__block变量的存储域 5.探究Block对对象的捕获过程 6.Block的循环引用问题 一、分析Block捕获外部变量的过程 为了保证block内部能够正常访问外部的变量,Block有一个变量捕获机制,即Block语法表达式所使用变量可以被保存到Bloc...

梧雨北辰的博客 969

OC底层 - block捕获变量

block是oc语言的一种代码块, 底层实现为oc对象, 代码块封装在一个函数中, 函数作为该oc对象的一个变量, 调用时, 直接调用该函数; 什么情况下block会捕获变量呢? 局部变量(自动变量) 如果block中使用了方法中的局部变量, 如下: -(void)test { int age = 10; void(^block1)(void) ^{ NSLog(@"%ld",age); }; } 因为局部变量(自动变量)在test方法结束的时候会被自动

Batac的博客 491

iOS block以及变量捕获

可以看到,在block的内部多了成员变量_age,并且在构造这个block时,会把age的值直接传进去,几_age=age,可以看出来这时是block捕获了局部变量,并且进行了值传递。可以看到全局变量没有捕获到block内部,是直接访问的,所以每次访问都能获得最新值。可以看出来age传递的是值,但是静态局部变量height传递的是指针。clang编译后的底层代码。1、局部变量和block。使用局部变量的block。3、全局变量和block。不同类型变量的捕获方式。

weixin_45157020的博客 890

block的变量捕获

为了保证block内部能够正常访问外部的变量,block有个变量捕获机制 block的类型 block有3种类型,可以通过调用class方法或者isa指针查看具体类型,最终都是继承自NSBlock类型 在ARC环境下,编译器会根据情况自动将栈上的block复制到堆上, 比如以下情况 block作为函数返回值时 将block赋值给__strong指针时 block作为Cocoa ...

feifeiwuxian的专栏 442

block对变量捕获的方式

block的捕获方式其实并不是对对象调用copy方法,而是进行值copy。对于基础类型和对象类型, 在block中进行赋值操作, 需要添加__block关键字,对于静态局部变量和全局变量, 就无需添加__block关键字。 对于非赋值操作,也无需添加__block关键字。

老猿的自留地 564

block底层实现与变量捕获

前言 首发地址:block底层实现与变量捕获 本文已经添加到专辑:《彻底弄懂OC》。 欢迎加入我的QQ群:661461410,一起探讨iOS底层原理。 带着问题阅读 block的本质是什么?你能讲出来它的底层结构吗? 全局变量会被block捕获吗?block会捕获哪些变量? block的底层数据结构 block又叫代码块,是OC语法中非常重要的一个概念,我们先来看一下Block的简单使用。 int main(int argc, const char * argv[]) { @autoreleas

乐戈 367
上一篇: 08.01-block
下一篇: 08.03-block的类型
淡暗云之遥
博客等级 码龄15年 61粉丝 71原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值