oc中的block在不同的位置存在很多变形, 经常容易搞晕,尤其是不经常使用block的小伙伴,想试用block, 但定义太复杂了,写不好就写不下去。
本文在使用block的几个地方梳理了一下, 如typedef, @property中, 方法内部定义一个临时的block, 作为函数形参, 作为函数实参等。
主要的格式如下
block的变量定义:
返回值类型(^block变量名)(参数1类型, 参数2类型,参数n类型...)
BOOL(^block3)(int, NSString *)
block的实现(也就是block变量的值)格式:
^返回值类型(参数1类型, 参数2类型,参数n类型...) {
// 代码
}
^BOOL(int age, NSString * name) {
NSLog(@"blockName: block3, age: %d, name: %@", age, name);
return YES;
};
BOOL(^block3)(int, NSString *) = ^BOOL(int age, NSString * name) {
NSLog(@"blockName: block3, age: %d, name: %@", age, name);
return YES;
};
在property中的格式:
返回值类型(^block变量名)(参数1类型, 参数2类型,参数n类型...)
和定义在方法中的格式是一样的
@property (copy, nonatomic) BOOL(^block1)(int, NSString *);
在typedef中的格式:
返回值类型(^block类型名)(参数1类型, 参数2类型,参数n类型...)
就是把普通block变量类型定义的变量名的位置换成了类型名,注意类型名建议要大写
typedef void(^RequestResult) (int, NSDictionary *);
// 使用typedef定义的block
@property (copy, nonatomic) RequestResult block2;
block在形参中的使用格式:
(返回值类型(^)(参数1类型, 参数2类型,参数n类型...) )block变量名
在形参中的形式非常奇葩,和前面的格式相差较大。
可以看做是把普通block变量定义中的变量名拿出来, 然后整个添加一个(),然后把变量名放在后面。
- (void)testBlock: (BOOL(^)(int, NSString *))block {
block(18, @"xiaoli");
}
block在是实参中的使用格式:
^返回值类型(参数1类型, 参数2类型,参数n类型...) {
// 代码
}
和block实现(值)的格式是完全一致的
[self testBlock:^BOOL(int age, NSString * name) {
NSLog(@"blockName: func_block, age: %d, name: %@", age, name);
return YES;
}];
block的调用格式:
block变量名(实参1, 实参2, ...);
BOOL result1 = self.block1(18, @"block1");
self.block2(18, @{@"url": @"https://www.baidu.com"});
BOOL result3 = block3(18, @"block3");
[self testBlock:^BOOL(int age, NSString * name) {
NSLog(@"blockName: func_block, age: %d, name: %@", age, name);
return YES;
}];
NSLog(@"result1: %d, result3: %d", result1, result3);
运行结果
DEMO Github地址:
https://github.com/gerrywg/blockDemo/tree/master