又见block(一):block是什么?
block的原理是一道分水岭,区分中高级程序的试金石,一般的大公司,他可能不会问你内存管理,甚至多线程编程问题也简单的一笔带过,但是block一定会仔细问。可惜的是平时只知使用,对其原理与实质没有深究,因此数次面试倒在这道坎上,真是心有不甘,这次好好理理关于block的前因后果,以供后续随手翻阅查证。
block的定义:带有自动变量(局部变量)的匿名函数
想要说明什么是匿名函数,先来了解下什么是函数以及函数指针
- 函数:函数是C语言程序中的重要组成部分,不同函数调用的组合实现程序的各个功能。
格式如下:
returnType funcName(paramter List){//funcBody}
returnType:函数返回值
funcName:函数名
paramter List:参数列表
funcBody:函数体
一个简单的函数如下:
int funcSum (int count) {return count + 10;}
定义了一个名为funcSum的函数,有一个int类型的形参,返回值是int类型
函数调用如下:
int result = funcSum(18);
- 函数指针:除了直接调用函数之外,我们还可以定义一个函数指针来指向这个函数地址,通过调用函数指针进而调用指向的函数,函数指针的定义如下:
returnType (*FuncPointer)(Paramter List)
继续上面定义的funcSum函数,现在定一个函数指针指向这个函数
int (*funcPointer)(int)= &funcSum;
调用函数指针方式如下:
int result = (*funcPointer)(18);
通过函数指针可以来调用函数,但是在给函数指针赋值的过程中,依然用到了函数名,因此在C语言中要想调用函数,无论是直接调用还是通过函数指针来调用都无法绕过函数名。
但是OC中的block,就可以使用不带函数名称的函数,即匿名函数,被看着是C语言的扩充功能。
在了解什么是匿名函数后,再来说说“带有自动变量(局部变量)”是什么意思?
变量的类型以及存储位置
- 全局变量:全局静态区
- 全局静态变量:全局静态区
- 局部静态变量:栈
- 局部变量:栈
局部变量:包括静态局部变量都是存在栈中的,超过作用域后就会被销毁
全局变量:包括全局静态变量,既不是存在栈中,也不是存在堆中,而是存放在“全局区/静态区”,占用静态的存储单元
block做为匿名函数,不但能访问全局变量,更重要的是拥有捕获函数外局部变量的功能,一般情况下,block中访问一个外部局部变量,block会持用它的临时状态,自动捕获变量值,捕获后修改外部的局部变量不会影响block内部捕获的状态
比较经典的例子:
int val = 23;void (^block) (void) = ^{NSLog(@"val = %d",val);};val = 2;block();
代码输出为:val = 23,不是2
block在定义实现时,就会对它捕获的外部局部变量进行一次只读拷贝,然后在block中使用该只读拷贝,即外部局部变量的副本,所以block外部修改局部变量,对其内部的副本无影响,就是说block捕获的是局部变量的瞬时值
那么这种情况下能否在block内对局部变量val值进行修改呢?尝试报错截图如下:
根据错误提示,我们修改代码如下
__block int val = 23;void (^block) (void) = ^{NSLog(@"val = %d",val);};val = 2;block();
代码输出结果为:val = 2,并且此时可以在block中修改外部的局部变量值
为什么在局部变量定义前加__block就能在block中修改捕获的局部变量值了,后面再继续分析,本节完,待续……
参考文章
又见block(二):block语法定义
又见block(三):block实质
又见block(四):block捕获自动变量
又见block(五): __block变量和对象
又见block(六):block存储域与__block变量存储域
又见block(七):截获对象
又见block(一):block是什么?相关推荐
- hdfs为什么要用block以及block大小的设置
1.在HDFS里面,文件存储为什么要以Block块的方式存储? 目的:减少磁盘寻道的时间. (1).不设置block:因为数据是分散的存放磁盘上的,读取数据时需要不停的进行磁盘寻道,开销比较大. (2 ...
- linux中block的概念,block(data block,directory block)、inode、块位图、inode位图和super block概念详解...
一.基本概念: 1.block:文件系统中存储数据的最小单元,ext3文件系统中,创建时默认4k,分为存储文件数据的data block和存储目录数据的directory block 2.inode: ...
- block(六)循环引用-b
在ARC与非ARC环境下对block使用不当都会引起循环引用问题,一般表现为,某个类将block作为自己的属性变量,然后该类在block的方法体里面又使用了该类本身,简单说就是self.theBloc ...
- 喜欢用Block的值得注意-Block的Retain Cycle的解决方法
本文不讲block如何声明及使用,只讲block在使用过程中暂时遇到及带来的隐性危险. 主要基于两点进行演示: 1.block 的循环引用(retain cycle) 2.去除block产生的告警时, ...
- 有趣 IOS 开展 - block 使用具体解释
Block 它是iOS于4.0新的程序语法之后,于iOS SDK 4.0之后,block应用几乎无处不在. 在其他语言中也有类似的概念,称为闭包(closure),实例object C兄弟swift ...
- linux block挂io,linux:在qemu中运行自编译内核:VFS:无法在未知的wn-block(0,0)上挂载root fs...
我试着让它运转起来,不知道我做错了什么.我已经创建了一个Debian.img(原始格式的磁盘,带有虚拟设备管理器 – 我认为是libvirt)并安装了debian而没有任何麻烦.现在我想用自编译的内核 ...
- Block详解------已完结
1.Block的使用 Block是什么? 块,封装了函数调用以及调用环境的OC对象, Block的声明 //1. @property (nonatomic, copy) void(^myBlock1) ...
- oc 协议 回调 静态成员_OC底层原理探究:Category、关联对象和block本质
1.分类Category的使用 // 给MJPerson类添加分类 @interface MJPerson : NSObject - (void)run; @end@implementation MJ ...
- iOS开发-由浅至深学习block
作者:Sindri的小巢(简书) 关于block 在iOS 4.0之后,block横空出世,它本身封装了一段代码并将这段代码当做变量,通过block()的方式进行回调.这不免让我们想到在C函数中,我们 ...
- java中block类6_Java 实现区块链中的区块,BLOCK的实现
区块链由若干个区块组成,区块是区块链的基础单元 2.区块链中区块的基本属性 区块6个属性的说明-Index 区块的索引值,区块链中的唯一键 区块6个属性的说明-Timestamp 区块的时间戳,用于区 ...
最新文章
- java中静态变量,静态代码块,静态方法,实例变量,匿名代码块的加载顺序
- 在eclipse中修改java web项目的名称
- 用C语言实现津巴布韦这道算法题?
- [TimLinux] Python 迭代器(iterator)和生成器(generator)
- linq from 多个sum_快手重拳打击劣质电商 7月以来封禁700多个团伙账号
- Base64 编解码
- 全国高校计算机课程教学系列报告会,西安交大承办2013年全国高校物理课程教学系列报告会...
- three.js glb 多个_直降7.1万元 奔驰GLB开始“大甩卖”
- Android常用的 adb shell命令
- ansible shell 之运行后台程序
- 基于opencv的手眼标定算法详解一-----------opencv之相机标定函数calibrateCamera()介绍
- tcpcopy mysql_MySQL容量规划之tcpcopy应用之道 西橙
- 轻量级私有云存储企业主要功能探析
- 【我的区块链之路】- 理解传统Kademlia和以太坊Kademlia网络
- android+注册+代码,简单的Android用户注册登录实现
- MATLAB系统仿真其三:Ornstein-Uhlenbeck(OU)噪声
- Sql Server 课堂笔记
- HTML5的最简单模板
- [转]体育运动比赛英语
- 观点| 如何避免GitHub那样断网43秒瘫痪 24 个小时?