1.Block的基本定义
Block 的基本写法(也是详细写法):
returnType (^blockName)(params) = ^returnType(params) {
// code...
};
中文再解释:返回类型 (^Block的名字)(Block的参数) = ^返回类型(Block的参数) { 这里放代码 }, 例:
int (^myBlock)(int num1, int num2) = ^int(int num1, int num2){
return 100;
};
如果你的 Block
不需要返回类型和参数,那么你可以简写为:
void (^myBlock2)() = ^(){
};
或
void (^myBlock2)(void) = ^void(void){
};
返回类型或参数,没有的话可以用 void
代替。
你也可以把等于号右边,^
后的 ()
删除,即是:
void (^myBlock2)() = ^{
};
你也可以先定义一个 Block 函数,但不写函数的实现,我们可以在后面再写具体函数的实现,像这样:
void (^myBlock2)(void);
myBlock2 = ^{
};
2.Block作为方法定义
把 Block 定义在方法里,与上面不同的是,Block 的名字不需要在声明时写上,而是在后面,像这样:
- (void)getWtihBlock:(void (^)())block
{
// code...
// 记得要调用block
block();
}
使用方法:
[self getWtihBlock:^{
NSLog(@"sdf");
}]
下面作了一个详细点的例子,并写了备注:
/**
* 追加自身字符串N次(每次复制前加一个换行\n)
*
* @param string 字符串
* @param count 追加次数
* @param stringBlock 目标Block,其中str参数为结果字符串
*/
// Block也可以定义在方法里,但是不需要定义Block的名字
// IOS开发很多的API也用到了Block,像UIView的块动画
- (void)getStrWithString:(NSString *)string
CopyCount:(int)count
resultString:(void (^)(NSString *str))stringBlock
{
NSMutableString *newString = [NSMutableString stringWithString:string];
for (NSUInteger i = 0; i < count; i++) {
NSUInteger len = [string length];
NSString *insertString = [NSString stringWithFormat:@"\n%@", string];
[newString insertString:insertString atIndex:len];
}
// 调用block,传入字符串newString
stringBlock(newString);
}
用法也是一样:
BlockObject *block = [[BlockObject alloc] init];
[block getStrWithString:@"Garvey"
CopyCount:3
resultString:^(NSString *str) {
// str为处理后的结果
NSLog(@"str is %@", str);
}];
3.使用 typedef 对 Block 起一个新类型
typedef void (^ResultBlock)(NSString *str);
定义方法时就变成了:
- (void)getStrWithString2:(NSString *)string
CopyCount:(int)count
resultString:(ResultBlock)stringBlock;
让我们对比一下,使用 typedef 前后:
// 使用前
- (void)getStrWithString:(NSString *)string
CopyCount:(int)count
resultString:(void (^)(NSString *str))stringBlock;
// 使用后
- (void)getStrWithString2:(NSString *)string
CopyCount:(int)count
resultString:(ResultBlock)stringBlock;