怎样使用Block
Block的声明
// 声明的标准语法结构
return_type (^block_name)(parameters);
// 示例: void(^myBlock)(NSString *, NSNumber *);
Block的定义
标准的定义结构:
^返回值类型(参数列表){函数体}
, 不过, 通场情况下返回值类型
是被省略的, 因为编译器可以从存储代码块的变量中确定返回值的类型
// 有参数传递
^(NSString *aString, NSNumber *aNumber){
// impl content
}
// 无参数传递
^{
// impl content
}
将定义赋值给生命的Block变量
// ①声明的同时进行定义
void(^myBlock)(NSString *, NSNumber *) = ^(NSString *aString, NSNumber *aNumber){
// impl content
};
// ②先声明再定义
void(^myBlock)(NSString *, NSNumber *);
myBlock = ^(NSString *aString, NSNumber *aNumber){
// impl content
};
Block的调用
// block的调用和函数调用没有任何区别, 没有实参列表的时候`()`同样不可以省略
myBlock(@"HouShiqi", @18);
Block作为Objective-C函数的参数
// 1.定义一个形参为Block的OC函数
- (void)useBlockForOC:(int(^)(int, int))aBlock
{
NSLog(@"result = %d", aBlock(300,200));
}
// 2.声明并赋值定义一个Block变量
int(^addBlock)(int, int) = ^(int x, int y){
return x+y;
};
// 3.以Block作为函数参数,把Block像对象一样传递
[self useBlockForOC:addBlock];
// 将123合一,以内联定义的Block作为函数参数
[self useBlockForOC:^(int x, int y){
return x+y;
}];
在实际开发中常用于回调(Callback), (和函数指针很像, 并不是巧合🤣)
为常用的Block创建typedef
与其他类型的变量不同, 在定义块变量时, 要把变量名放在类型之中, 而不要放在右侧. 这种语法非常难记, 也非常难读. 鉴于此, 我们应该为常用的块类型起个别名, 尤其是打算把代码发布成API供他人使用时. ------- From《Effective Objective-C 2.0》