Objective C 中 Block 的定义

Objective C 中 Block 的定义_第1张图片
Objective C 中 Block 的定义_第2张图片

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?

(完)

你可能感兴趣的:(Objective C 中 Block 的定义)