内容大纲:1、Blocks概要2、Blocks模式3、Block实质(面试常问重点) 1、Blocks概要什么是Blocks:Blocks是C语言的扩充的功能,可以用一句话来表示Blocks的扩充功能:带有局部变量(有的资料局部变量也叫自动变量)的匿名函数。这个函数叫bloc ...
内容大纲:
1、Blocks概要
2、Blocks模式
3、Block实质(面试常问重点)
1、Blocks概要
什么是Blocks:Blocks是C语言的扩充的功能,可以用一句话来表示Blocks的扩充功能:带有局部变量(有的资料局部变量也叫自动变量)的匿名函数。这个函数叫block。 (注意Blocks是一种功能,block是一种函数)
1-1、关于"匿名函数"
匿名函数:不带有名称的函数就是匿名函数。(但是C语言的标准不允许存在这样的函数。)
例如下面的源代码:在赋值给函数指针时,若不使用赋值的函数的名称,就无法取得该函数的地址:
然而通过Block,源代码中就能够使用匿名函数,即不带名称的函数。
1-2、关于"带有局部变量(有的资料讲局部变量也叫自动变量)"
这里为了能够让你们更好的理解这个"带有局部变量(有的资料局部变量也叫自动变量)",我需要拿普通的函数被回调的过程
和Block函数被回调的过程
进行对比,这样能够让读者更好的理解这个block的"带有局部变量(有的资料局部变量也叫自动变量)"的意义,以及这个block的特点。
(瞎扯两句:通过对比出与众不同的地方是可以成为特点的😉)
普通函数被回调的过程 和 block函数被回调的过程 的对比
为了能让读者进一步体会block的特性,本人分别在上面两个源码的函数被调用执行之前相应的地方添加了大括号设置局部变量的作用域,请看下面代码理解
总结:
补充:可能有读者觉得那block肯定能获取全局变量,可是全局变量普通函数也能获取啊,所以没必要在这里扯全局变量。(这句补充的话读者要是还不懂,那你就自行脑补吧。👻)
另 外介绍:"带有局部变量的匿名函数"这一概念并不仅指Blocks,它还存在于其他许多编程语言中,在计算机中,此概念也称为闭包(Closure)、 lambda计算(λ计算,lambda calculus)等,Objective-C的Block在其他程序语言中的名称如下表格:
2、Blocks模式
2-1、Block 语法
Block语法格式:^ 返回值类型 (参数列表) {表达式}
省略形式的语法(只有两种):
省略了返回值类型:^ (参数列表) {表达式}
2-2、Block 类型变量
先简单讲讲基本数据类型的类型变量,int a = 2
这个a就是int类型的变量,这个变量a存储着具体的值:2。
再讲讲函数指针类型变量:
这个funcptr就是函数指针类型的变量。这个变量指向(指针类型所以说是指向)func函数的地址。
那么同样的,在Block语法下,可将前面讲的"Block语法"赋值给声明为Block类型的变量中。
声明Block类型变量的格式:
返回值 (^变量名)(参数列表)
使用Block语法将Block赋值为Block类型变量:
这个就是局部变量值的截获,截获之后被这个block所持有,因此叫做"带有局部变量的匿名函数"。
2-5、__block说明符
实际上,虽然block可以截获并拿到这个局部变量的值,但是却不能在block内部直接更改它,下面的代码会产生编译错误:
使用附有block说明符的自动变量可以在Block中赋值,该变量称为blcok变量。
2-6、截获的局部变量相关的问题
3、Blocks的实现(面试常问重点)
3-1、Block的实质
Block是"带有局部变量的匿名函数",但是Block究竟是什么呢?本节将通过Block的实现进一步帮大家加深理解。
要想理解Block的实质,需要通过下面的终端命令将Block反编译成底层C++的源代码,虽然说是C++代码,其实也是仅仅使用了C++的struct结构,其本质还是C语言的源代码。
clang -rewrite-objc 源代码文件名
原标题:深入浅出Block的方方面面(持续更新)
关键词:
*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们:
admin#shaoqun.com
(#换成@)。