在IOS中,block块是新添加的语法,其他程序语言中也被称为闭包。
程序块的理念是像任何其他C语言类型一样对待特定的代码块。程序块可以分配给一个变量,以参数的形式传递给函数或方法,当然也可以执行(不同于其他大部分类型)。通过这种方式,程序块可替代Object-C中的委托模式或C中的回调函数。
跟方法或函数很想,程序块可以接受一个或多个参数并指定一个返回值。要声明程序块变量,可以使用“^”符号以及其他一些放在圆括号内的代码来声明参数和返回类型。要定义程序块本身,执行的操作大体相同,但要在后面添加定义程序块的实际代码。
例子(创建block、赋值block、调用block):(这里的block例子没有返回值)
//声明一个块变量myBlock,这个块参数没有返回值
void(^myBlock)(void); //声明完之后,对myBlock赋值
myBlock = ^{NSLog(@"This is my block!")} //声明完之后,我们执行这个块函数(就像调用函数一样调用)
myBlock();
程序块可以访问在创建它的范围内所有可用的变量。在默认情况下,程序块通过这种方式获取了你要访问的变量,将值复制到一个新的同名变量中,保留原始变量不变。在block块中使用外部变量,如果外部变量是局部变量,要在这个变量声明前加__block。
不同作用域变量对于block赋值不同。如果是局部变量A,在block内进行赋值,则可以赋值,外部赋值无效。例如:
//成员变量
int a
static int b; {
__block NSString d; void (^aBlock)(void) = ^(void) {
a = ;
b = ;
d = "d1"; //在block中设置d=d1
}; d= "d2"; //执行block,这里输出a=2, b=3, d='d1' 注意这里的d!=d2,是等于d1
aBlock();
}
可以参照苹果官方文档对于block的介绍: