Block语法

2016-10-18  本文已影响0人  OneCoinMan

block定义

block类似于c语言中的函数指针,其定义方式为:
返回值类型 (blockName)(参数列表)=(参数){... ...};
如:

    NSString *rank = @"111";
    NSString *name = @"aaa";
    NSString * (^blockAppendingString)(NSString *str1, NSString *str2) = ^(NSString *str1, NSString *str2){
        str1 = [str1 stringByAppendingString:str2];
        return str1;
    };
    NSString * result = blockAppendingString(rank, name);
    NSLog(@"result is :%@",result);

使用

定义好的block可以想函数一样适用。但是更经常的是直接使用代码块如:

    NSArray *array = [NSArray arrayWithObjects:@"3", @"2", @"1", nil];
    NSArray *array2 = [array sortedArrayUsingComparator:^NSComparisonResult(id  _Nonnull obj1, id  _Nonnull obj2) {
        return [obj1 compare: obj2];
    }];
    NSLog(@"array2:%@", array2);

sortedArrayUsingComparator:方法中的block被当作参数传入方法中,并在需要的时候调用。

使用typedef

使用typedef可以定义一个代码块变量,当出现大量形式相同的代码块时,可以使用此方法:

    typedef NSString * (^str_block_type)(NSString  *str);
    str_block_type my_block = ^(void){
        return str;
    };
    str_block_type your_block =^(NSString *str){
        return @"your block type";
    };

其中str_block_type可以像int,NSString等字段一样使用,用来定义具有相同参数列表,和返回值的block。

block参数

block可以访问与其同级的变量,但是不能修改,如果要修改,需要将该变量定义为__block属性的变量:

    NSString *rank = @"111";
    NSString *name = @"aaa";
    __block NSString *result = @"22222";
    NSString * (^blockAppendingString)(NSString *str1, NSString *str2) = ^(NSString *str1, NSString *str2){
        result = [str1 stringByAppendingString:str2];

        return result;
    };

以上代码中,result被代码块使用时修改了其值,因此需要定义为__block属性,否则会报错。


错误.png

值得注意的是,代码块在被创建时,会捕捉此时的本地变量状态,在此之后更改变量,也不会改变block中该变量的值如:

NSString *test = @"before";
    NSString * (^blockAppendingString)(NSString *str1, NSString *str2) = ^(NSString *str1, NSString *str2){
        result = [str1 stringByAppendingString:str2];
        NSLog(@"test:%@",test);
        return result;
    };
    test = @"after";
    blockAppendingString(rank, name);

输出结果为“before”,而不是“after”。

上一篇 下一篇

猜你喜欢

热点阅读