1.定义
闭包是一个允许访问自由变量(局部变量)的匿名函数。自由变量:跟block声明在同一个作用域内的局部变量。
2.语法结构
返回类型 (^块名称)(参数列表)
int (^myblock)(int a, int b) ; //声明一个块类型和块名,myblock为块名,块类型为int (^)(int a, int b);
myblock= ^(int a, int b) { return a+b;}; //定义块
int c = myblock(1,2); //c = 3; //调用块
从上面代码,块跟一个变量一样,先声明,定义,访问。
块变量与一般的C语言变量完全相同,可以作为以下用途。
局部变量
函数参数
静态变量
静态全局变量
全局变量
例1.块作为属性变量
@interface
EOCClass :
NSObject
@property ( nonatomic , strong ) int (^variableName)( int a, int b
);
@property ( nonatomic , strong ) int (^variableName)( int a, int b
);
@end
@implementation
EOCClass
- ( id )init {
- ( id )init {
if((self= [superinit])) {
_variableName= ^(inta,intb) { //定义一个块,但块里面的代码还没被调用
return
a + b;
};
}
return self ;
}
- ( void )fun {
int c = _variableName ( 1 , 2 ); //block 被调用,即执行上面定义的代码 a+b
};
}
return self ;
}
- ( void )fun {
int c = _variableName ( 1 , 2 ); //block 被调用,即执行上面定义的代码 a+b
}
@end
声明定义好一个块之后,就可以像传递一个变量一样,把block里面的代码传递到其他地方运行。这是块其中一个强大之处。
3.捕获自由变量
块另外一个强大之处是:在声明它的范围里,所有变量都可以为其捕获。例2
@implementation
EOCClass
- ( id )init {
if (( self = [ super init ])) {
int additional = 5 ;
_variableName = ^( int a, int b) { // 定义一个块
return a + b + additional; //additional
- ( id )init {
if (( self = [ super init ])) {
int additional = 5 ;
_variableName = ^( int a, int b) { // 定义一个块
return a + b + additional; //additional