带有自动变量(局部变量)值的匿名函数。
首先,回顾一下在C语言的函数中可以使用的变量:
- 自动变量(局部变量)
- 函数参数
- 静态变量(静态局部变量)
- 静态全局变量
- 全局变量
其中,在函数的多次调用能够传递值的变量: - 静态变量
- 静态全局变量
- 全局变量
虽然这些变量的作用域不同,但在整个程序中,一个变量总保持在一块内存区域。虽然多次调用函数,但是变量的值保持不变。在任何时候,任何调用,变量的值保持不变。
Block的本质:
第一,block的使用的匿名函数实际被当做简单的c语言的函数来处理。
其中函数参数__cself为指向block值的变量。
其实所谓Block就是Objective-C对象。
在将Block作为Objective-C的对象处理时,关于该类的信息放置于_NSConcreteStackBlock中。
总的来说,所谓“截获自动变量值”意味着在执行Block语法时候,Block语法表达式所使用的自动变量值被保存到结构体实例中。
截获自动变量时,将值传递给结构体构造函数进行保存。
Block中所使用的被截获自动变量,仅仅截获自动变量的值。Block中使用自动变量后,在Block的结构体实例中重写该自动变量也不会改变原先截获自动变量。
解决这个问题有两种方法。第一种:C语言中有一个变量,允许Block改写值。具体如下:
- 静态变量
- 静态全局变量
- 全局变量
虽然Block语法的匿名函数部分简单地变换为了C 语言函数,但从这个变换的函数中访问静态全局变量、全局变量并没有任何改变,可直接使用。