1. 程式人生 > >Objective-c:Block

Objective-c:Block

# 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);
}];