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属性,否则会报错。
值得注意的是,代码块在被创建时,会捕捉此时的本地变量状态,在此之后更改变量,也不会改变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”。