block语法
^ 返回值类型 ( 参数列表 ) {表达式};
^ void(NSInteger count){
count ++;
};
返回值类型可省略:
//返回值为void
^ (NSInteger count){
count ++;
};
//有返回值
^ (NSInteger coutt){
return coutt++;
};
//当有返回值的时候,多个return的值类型必须相同
^ (NSInteger count){
if (count < 0) {
return count++;
}else{
return count--;
}
};
//无参数时候,参数列表也可省略
^{
return 100;
};
block的声明:
返回值类型 (^ block的名字)(参数列表);
NSInteger (^blk)(NSInteger k,NSInteger l) = ^ NSInteger(NSInteger k,NSInteger l){
return k+l+2;
};
blk(6,2);
//也可以省略参数名字
NSInteger (^blk2)(NSInteger,NSInteger) = ^ NSInteger(NSInteger k,NSInteger l){
return k+l+2;
};
blk2(6,2);
//也可以如下
NSInteger (^blk)(NSInteger,NSInteger) = ^(NSInteger k,NSInteger l){
return k+l+2;
};
blk(6,2);
截取自动变量
- (void)testBlock{
NSInteger qq = 100;
NSInteger (^blk)(NSInteger,NSInteger) = ^ NSInteger(NSInteger k,NSInteger l){
return k+l+qq;
};
qq = 200;
blk(0,0);
NSLog(@"value==%ld",blk(0,0));//value==100;
}
__block 说明符
上述已经表明,自动变量值获取只能保存执行block语法瞬间的值,保存后无法修改,__block可以去修改。
__block NSInteger jk = 20;
NSInteger (^blk2)() = ^ NSInteger(){
jk = 30;
return jk;
};
blk2();
NSLog(@"value==%ld",blk2());//value==30;
//不用__block修饰不能直接修改变量的值,但是可以使用。
NSMutableArray *arr = [NSMutableArray arrayWithCapacity:0];
void (^blk3)(void) = ^{
NSObject *obj = [[NSObject alloc] init];
[arr addObject:obj];
};
blk3();
NSLog(@"===%@",arr);//arr增加了数据
网友评论