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是什么?相关推荐

  1. hdfs为什么要用block以及block大小的设置

    1.在HDFS里面,文件存储为什么要以Block块的方式存储? 目的:减少磁盘寻道的时间. (1).不设置block:因为数据是分散的存放磁盘上的,读取数据时需要不停的进行磁盘寻道,开销比较大. (2 ...

  2. linux中block的概念,block(data block,directory block)、inode、块位图、inode位图和super block概念详解...

    一.基本概念: 1.block:文件系统中存储数据的最小单元,ext3文件系统中,创建时默认4k,分为存储文件数据的data block和存储目录数据的directory block 2.inode: ...

  3. block(六)循环引用-b

    在ARC与非ARC环境下对block使用不当都会引起循环引用问题,一般表现为,某个类将block作为自己的属性变量,然后该类在block的方法体里面又使用了该类本身,简单说就是self.theBloc ...

  4. 喜欢用Block的值得注意-Block的Retain Cycle的解决方法

    本文不讲block如何声明及使用,只讲block在使用过程中暂时遇到及带来的隐性危险. 主要基于两点进行演示: 1.block 的循环引用(retain cycle) 2.去除block产生的告警时, ...

  5. 有趣 IOS 开展 - block 使用具体解释

    Block 它是iOS于4.0新的程序语法之后,于iOS SDK 4.0之后,block应用几乎无处不在. 在其他语言中也有类似的概念,称为闭包(closure),实例object C兄弟swift ...

  6. linux block挂io,linux:在qemu中运行自编译内核:VFS:无法在未知的wn-block(0,0)上挂载root fs...

    我试着让它运转起来,不知道我做错了什么.我已经创建了一个Debian.img(原始格式的磁盘,带有虚拟设备管理器 – 我认为是libvirt)并安装了debian而没有任何麻烦.现在我想用自编译的内核 ...

  7. Block详解------已完结

    1.Block的使用 Block是什么? 块,封装了函数调用以及调用环境的OC对象, Block的声明 //1. @property (nonatomic, copy) void(^myBlock1) ...

  8. oc 协议 回调 静态成员_OC底层原理探究:Category、关联对象和block本质

    1.分类Category的使用 // 给MJPerson类添加分类 @interface MJPerson : NSObject - (void)run; @end@implementation MJ ...

  9. iOS开发-由浅至深学习block

    作者:Sindri的小巢(简书) 关于block 在iOS 4.0之后,block横空出世,它本身封装了一段代码并将这段代码当做变量,通过block()的方式进行回调.这不免让我们想到在C函数中,我们 ...

  10. java中block类6_Java 实现区块链中的区块,BLOCK的实现

    区块链由若干个区块组成,区块是区块链的基础单元 2.区块链中区块的基本属性 区块6个属性的说明-Index 区块的索引值,区块链中的唯一键 区块6个属性的说明-Timestamp 区块的时间戳,用于区 ...

最新文章

  1. java中静态变量,静态代码块,静态方法,实例变量,匿名代码块的加载顺序
  2. 在eclipse中修改java web项目的名称
  3. 用C语言实现津巴布韦这道算法题?
  4. [TimLinux] Python 迭代器(iterator)和生成器(generator)
  5. linq from 多个sum_快手重拳打击劣质电商 7月以来封禁700多个团伙账号
  6. Base64 编解码
  7. 全国高校计算机课程教学系列报告会,西安交大承办2013年全国高校物理课程教学系列报告会...
  8. three.js glb 多个_直降7.1万元 奔驰GLB开始“大甩卖”
  9. Android常用的 adb shell命令
  10. ansible shell 之运行后台程序
  11. 基于opencv的手眼标定算法详解一-----------opencv之相机标定函数calibrateCamera()介绍
  12. tcpcopy mysql_MySQL容量规划之tcpcopy应用之道 西橙
  13. 轻量级私有云存储企业主要功能探析
  14. 【我的区块链之路】- 理解传统Kademlia和以太坊Kademlia网络
  15. android+注册+代码,简单的Android用户注册登录实现
  16. MATLAB系统仿真其三:Ornstein-Uhlenbeck(OU)噪声
  17. Sql Server 课堂笔记
  18. HTML5的最简单模板
  19. [转]体育运动比赛英语
  20. 观点| 如何避免GitHub那样断网43秒瘫痪 24 个小时?

热门文章

  1. pycharm更换主题,pycharm更换皮肤,pycharm更换不同颜色
  2. 编写函数求解一元二次方程
  3. 用Python实现无条件重复循环
  4. 数据分析入门学习指南|零基础小白必看
  5. 基于Python的ADF单位根检验方法——时间序列平稳检验
  6. 【百宝云】按键精灵软件注册码系统
  7. 你真的认为iPhone只是一部手机?苹果惊天秘密之 一
  8. 联邦学习的威胁模型和攻防现状
  9. 张艾迪(创始人):艾迪的学校与成长故事
  10. Android各厂商Rom包解压方式