Objective C 中 Block 的各种声明和定义形式,看过八百遍了,总是忘记怎么写。现在写一遍记下来备查。
本文以如下形式 block 举例:
- 入参为两个
NSString *
类型参数 - 返回值为
NSString *
类型
实现两个字符串拼接
用于说明 block 的如下写法:
- 声明
- 定义
- 使用
一、不使用 typedef
1、普通形式声明、定义、使用 Block 方式
// 声明
NSString *(^myBlock)(NSString *, NSString *);
// 定义
myBlock = ^NSString *(NSString *str1, NSString *str2) {
return [str1 stringByAppendingString:str2];
};
// 使用
NSString *s = myBlock(@"abc", @"123");
NSLog(@"s = %@", s);
2、Block 作为函数参数
// 声明
- (void)callBlock:(NSString *(^)(NSString *, NSString *))myBlock;
// 使用方法
[obj callBlock:^NSString *(NSString *str1, NSString *str2) {
return [str1 stringByAppendingString:str2];
}];
二、使用 typedef
1、声明、定义、使用 Block 方式
// typedef
typedef NSString *(^MyBlockDef)(NSString *, NSString *);
// 声明
MyBlockDef myBlock;
// 定义
myBlock = ^NSString *(NSString *str1, NSString *str2) {
return [str1 stringByAppendingString:str2];
};
// 使用
NSString *s = myBlock(@"abc", @"123");
NSLog(@"s = %@", s);
2、Block 作为函数参数
// typedef
typedef NSString *(^MyBlockDef)(NSString *, NSString *);
// 声明
- (void)callBlockWithTypeDef:(MyBlockDef)myBlock;
// 使用方法
[obj callBlockWithTypeDef:^NSString *(NSString *str1, NSString *str2) {
return [str1 stringByAppendingString:str2];
}];
三、总结
1、所有区别都体现在 Block 的不同声明形式,具体定义形式都一致;
2、Block 的声明中,形参可以只指定类型,不指定参数名;定义中必须都完整指定;
3、typedef
与 声明块类型变量
写法一致,但区别于对象方法中参数的声明。
四、相关资料
How Do I Declare A Block in Objective-C?
(完)