

Objective C 中 Block 的各種聲明和定義形式,看過八百遍了,總是忘記怎么寫?,F(xiàn)在寫一遍記下來備查。
本文以如下形式 block 舉例:
- 入?yún)閮蓚€
NSString *類型參數(shù) - 返回值為
NSString *類型
實現(xiàn)兩個字符串拼接
用于說明 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 作為函數(shù)參數(shù)
// 聲明
- (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 作為函數(shù)參數(shù)
// typedef
typedef NSString *(^MyBlockDef)(NSString *, NSString *);
// 聲明
- (void)callBlockWithTypeDef:(MyBlockDef)myBlock;
// 使用方法
[obj callBlockWithTypeDef:^NSString *(NSString *str1, NSString *str2) {
return [str1 stringByAppendingString:str2];
}];
三、總結
1、所有區(qū)別都體現(xiàn)在 Block 的不同聲明形式,具體定義形式都一致;
2、Block 的聲明中,形參可以只指定類型,不指定參數(shù)名;定義中必須都完整指定;
3、typedef 與 聲明塊類型變量寫法一致,但區(qū)別于對象方法中參數(shù)的聲明。
四、相關資料
How Do I Declare A Block in Objective-C?
(完)