block 的理解

2018-08-23  本文已影响24人  西门淋雨

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增加了数据
上一篇 下一篇

猜你喜欢

热点阅读