Objective-c:Block
阿新 • • 發佈:2018-12-26
# Block 概述
標準C裡面沒有Block, C語言的後期擴充套件版本, 加入了匿名函式; C++、JS、 Swift等語言中, 有類似語法, 叫做閉包!
block語法和函式指標很相似。回顧, C語言中的指標函式:
c
int(*) (int x, int y)
即: 指向兩個整型引數, 一個整型返回值函式的指標!
Block函式, 沒有名稱的函式,例如:
int(int x, int y)
因為Block是匿名函式, block變數存放函式的實現, 通過block變數能直接呼叫函式, 沒有名稱的函式該如何呼叫呢? (有名稱的話, 可以直接呼叫, 也可以通過函式指標來呼叫)
例如定義C語言的函式指標!
int sum(int a, int b) {
return a + b;
}
// 定義函式
int (*p)(int, int) = sum;
NSLog(@"%ld", p(10, 10)); // 20
// 函式指標型別:int (*) (int, int)
// 函式指標變數:p
// 函式指標的值:sum
看看block語法:
block型別: int(^)(int, int)
block變數: block
block的值: ^(int a, int b){
return a + b ;
};
定義block語法塊:
int (^block)(int int) = ^(int a, int b) {
return a + b;
}
# Block 型別
// 1. 無引數無返回值
void(^sayHello)(void) = ^(void) {
NSLog(@"Hello!");
};
// 2. 有引數無返回值
void(^sayHelloWith)(char *) = ^(char *name) {
NSLog(@"Hello, %s!", name);
};
// 3. 無引數有返回值
int (^getNumber)(void) = ^(void ){
return 10;
};
// 4. 有引數有返回值
int (^sum)(int, int) = ^(int a, int b) {
return a + b;
};
# __block
如果要在 block 內部修改在 block 外面定義的變數,需在定義該變數時新增 __block
修飾符(兩個下劃線),如下所示:
__block int a = 10;
void(^block)(void) = ^(){
a = 20;
};
block();
NSLog(@"%d", a);
# 使用 typedef
// 定義block型別
typedef void(^block) (int, int);
// 定義block變數並賦值
block sum = ^(int a, int b) {
NSLog(@"%d", a + b);
};
// 呼叫block
sum(10, 10);
# Block 回撥
定義一個 Tools 的類,宣告如下方法:
- (void)sumWith:(int)a b:(int)b callback:(void(^)(int res))callback;
實現 Tools 方法:
- (void)sumWith:(int)a b:(int)b callback:(void (^)(int))callback {
callback(a + b);
}
main 函式中呼叫:
[[Tools new] sumWith:10 b:10 callback:^(int res) {
NSLog(@"%d", res);
}];